【问题标题】:How to create a Mesh from normals and uv in Unity?如何在 Unity 中从法线和 uv 创建网格?
【发布时间】:2020-09-14 17:40:15
【问题描述】:

您好,我有来自 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】:

    首先,一般而言,要将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2022-11-23
      • 2019-08-22
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多