如何使用顶点?

问题描述

我正在尝试创建一条彩色线,使用立方体上两个顶点之间的距离作为线的起点和终点。


考虑以下代码

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*/);
}