如何在Unity中从法线和UV创建一个Mesh?

问题描述 投票:0回答:1

嗨,我有这个数据来自一个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?是否有一个库或一个内置的函数?

unity3d normals vertices uv-mapping
1个回答
0
投票

首先在一般情况下,为了将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
© www.soinside.com 2019 - 2024. All rights reserved.