unity3d - 如何在 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 中的材质?是否有库或内置函数?
解决方案
首先,通常要将您的 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
推荐阅读
- python - 如何使用 OOP 概念在 Tkinter 中添加背景图像?
- c - 使用 c-lib 函数 qsort 时如何删除“不兼容的函数指针类型”警告
- discord.js - 我需要帮助解决这个机器人无法打开的问题吗?
- firebase - 将 Firebase 与 Touchdesigner 关联
- javascript - 无法从 MusixMatch API 获取数据获取“请求的资源上不存在“没有 'Access-Control-Allow-Origin' 标头。”错误
- python - 将自定义函数应用于依赖于可变数量的先前行的 pandas 数据帧
- reactjs - 在 React 中根据路由更改背景图像
- android - Kotlin:如何从选定的图片库中获取图片的路径
- firebase - 如何将我从数据库中读取的 Firestore 文档数据存储在变量中?
- vue.js - 我们可以使用props在vue中传递变量吗?