unity创建的立方体如何去掉一面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity创建的立方体如何去掉一面相关的知识,希望对你有一定的参考价值。
参考技术A 要将一个立方体去掉一个面,可以用以下几种方法:1、创建一个立方体,右键转为可编辑多边形,在多边形级别,选择其中一个面,删除。
2、创建一个矩形,添加挤出修改器,去掉封口始端或封口末端的勾。
3、创建一个矩形和一条线,放样,封口始端和封口末端两个勾去掉一个。
如何在 Unity 中从法线和 uv 创建网格?
【中文标题】如何在 Unity 中从法线和 uv 创建网格?【英文标题】:How to create a Mesh from normals and uv in Unity? 【发布时间】: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 中创建立方体及其材质?是否有库或内置函数?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于unity创建的立方体如何去掉一面的主要内容,如果未能解决你的问题,请参考以下文章
unity 3d实例:创建游戏对象旋转的立方体Unity3D Button图片按钮Box控件Label控件Background ColorColor
Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用