嗨,我有这个数据来自一个API,我知道它是一个立方体。
{
"position": {
"itemSize": 3,
"type": "Float32Array",
"array": [
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
-0.5,
-0.5
],
"normalized": false
},
"normal": {
"itemSize": 3,
"type": "Float32Array",
"array": [
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1
],
"normalized": false
},
"uv": {
"itemSize": 2,
"type": "Float32Array",
"array": [
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0
],
"normalized": false
}
}
我现在如何从这些数据创建一个立方体和它的材料在Unity?是否有一个库或一个内置的函数?
首先在一般情况下,为了将JSON数据解析成有用的结构,你需要有一个相应的类结构,并使用例如 JsonUtility
[Serializable]
public class DataSet
{
public int itemSize;
public int[] array;
public bool normalized;
}
[Serializable]
public class Example
{
public DataSet position;
public DataSet normal;
public DataSet uv;
}
并做
var data = JsonUtility.FromJson<Example>(yourJsonString);
接下来,这些数据还是很原始的,我们必须进一步解析它,因为我们想要有效的向量值。
var vertices = new List<Vector3>();
for(var i = 0; i < data.position.array.Length; i+=3)
{
if(i+2 > data.position.array.Length - 1) break;
var x = data.position.array[i];
var y = data.position.array[i+1];
var z = data.position.array[i+2];
vertices.Add(new Vector3(x,y,z));
}
法线和UV也是如此(只是这里用的是 Vector2
而不是)
然后是主要问题。既然你已经有了位置(我猜是顶点)、法线和UV,我猜你想知道从哪里得到三角形。
UVs在这里根本帮不上忙,因为它们只是纹理坐标,定义了以后如何将纹理映射到三角形上。
另外,法线在这里也帮不了你。法线只是一个方向,并不能提供任何有用的信息,说明哪三个顶点一起构成了一个三角形。
只有当你知道总是三个连续的顶点组成一个三角形--意味着你的网格有重复的顶点--才有可能得到三角形。
否则我认为不可能从你给定的数据中知道三角形。
在Unity中,三角形是一个简单的平面,它是由一个三角形组成的。int[]
其中总有三个顺序元素是来自顶点数组的三个顶点的索引。
所以,在一个假设下,它们只是结果的东西,如
var triangles = new int[vertices.Length];
for(var i = 0; i < triangles.Length; i++)
{
triangles[i] = i;
}
然后,你可以简单地把它放在一起,并创建一个网格,如
var mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
// Etc