首页 > 解决方案 > 如何在 Unity 中从法线和 uv 创建网格?

问题描述

嗨,我有来自 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 中的材质?是否有库或内置函数?

标签: unity3dnormalsverticesuv-mapping

解决方案


首先,通常要将您的 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,我猜你想知道从哪里得到三角形。

UV 在这里根本没有帮助,因为它们只是定义纹理稍后如何映射到三角形上的纹理坐标。

此外,法线在这里也无法真正帮助您。法线只是一个方向,并没有提供任何关于哪三个顶点一起构成三角形的有用信息。

只有当您知道例如总是 3 个连续的顶点组成一个三角形时,才能获得三角形 - 这意味着您的网格具有重复的顶点。

否则我会说不可能从你给定的数据中知道三角形。

在 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

推荐阅读