问题描述
我正在尝试创建一条彩色线,使用立方体上两个顶点之间的距离作为线的起点和终点。
考虑以下代码:
Vector3[] verticesArray = transform.GetComponent<MeshFilter>().mesh.vertices;
我被告知 verticesArray
是按顺时针方向排序的,我还被告知 verticesArray
填充了本地定位的顶点位置。
我的问题是顶点是如何排序的,是从上到下,从左到右?它们[顶点]是本地定位还是世界定位?它们与 GameObject
有什么关系,例如它们是否有一个像物体中心这样的参考点,是什么使它们局部定位?
我尝试向对象的位置添加一个随机顶点值我试图在 transform.TransformPoint()
中找到顶点以查看该顶点是否在本地位置以及 {{1} 中是否存在某种顺序}} 数组,遗憾的是位置离目标很远,没有回答我的问题。
解决方法
有人告诉我 verticesArray
是按顺时针方向排序的
我的问题是顶点是如何排序的,是从上到下,从左到右?
不!Mesh.vertices
不一定完全有序!这完全取决于网格是如何创建的。请注意,无论如何,“从上到下”或“从左到右”在 3D 中都没有实际意义。
您可以做的只是通过 Mesh.triangles
。
那是一个 int
数组。它们以一组 3 后续元素引用一个三角形的方式“排序”,并且顺序决定了三角形面向的方向(顺时针/逆时针)。 int
中的 triangles
值是指 vertices
数组中对应的 3 个顶点的索引。多个三角形甚至可以通过简单地引用 vertices
中的相同索引来共享公共顶点。
这可能也更有意义,因为每个顶点之间没有线/边,但您似乎对三角形更感兴趣。
它们[顶点]是本地定位还是世界定位?以及它们与 GameObject
的关系,例如它们是否有一个像对象中心这样的参考点,是什么使它们局部定位?
这些是原始 Mesh
中的顶点。它们不会缩放、旋转或平移。换句话说,是的,它们位于本地空间。 Mesh
中的位置都相对于 GameObject
的轴心点。
使用 Transform.TransformPoint
- 正如您所做的 - 应该会导致正确的世界空间位置。
var mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
// Iterate over the triangles in sets of 3
for(var i = 0; i < triangles.Length; i += 3)
{
// Get the 3 consequent int values
var aIndex = triangles[i];
var bIndex = triangles[i + 1];
var cIndex = triangles[i + 2];
// Get the 3 according vertices
var a = vertices[aIndex];
var b = vertices[bIndex];
var c = vertices[cIndex];
// Convert them into world space
// up to you if you want to do this before or after getting the distances
a = transform.TransformPoint(a);
b = transform.TransformPoint(b);
c = transform.TransformPoint(c);
// Get the 3 distances between those vertices
var distAB = Vector3.Distance(a,b);
var distAC = Vector3.Distance(a,c);
var distBC = Vector3.Distance(b,c);
// Now according to the distances draw your lines between "a","b" and "c" e.g.
Debug.DrawLine(transform.TransformPoint(a),transform.TransformPoint(b) /*,someColorDependingOnDistAB*/);
Debug.DrawLine(transform.TransformPoint(a),transform.TransformPoint(c) /*,someColorDependingOnDistAC*/);
Debug.DrawLine(transform.TransformPoint(b),someColorDependingOnDistBC*/);
}