因此,我需要使用具有n个顶点的Unity Mesh组件生成多边形。我正在使用一个自定义Triangulate()函数,该函数能够找到mesh.triangles的索引。
问题是,根据我提供的函数的顶点,多边形会在错误的一侧生成,并且有时对照相机不可见(除非我将照相机翻转到另一侧)。
现在,我知道这与Unity的顺时针缠绕顺序有关,但是无论我输入的顶点如何,如何确保多边形始终在正确的一侧生成?还是有办法知道生成网格的哪一侧,以便我可以相应地调整相机?
n
指向您的眼睛,则意味着您可以看到撞击该表面的光的一部分。要知道是否可以看到三角形,您需要知道法线是否指向您。在不进行数学运算的情况下,通过计算由三角形的顶点定义的向量的叉积来给出法线。
例如,三角形A-B-C可以由矢量AB和BC定义(与上图无关)。或者,您可以反转该三角形的“方向”并将其定义为AC和CB。由于数学,AB / BC的法线有一个方向,AC / CB的法线有相反的方向-如果您在Google上搜索此书,则可以了解原因,其中有大量教程。因此,我写这一切都是为了告诉您已经知道的事情:顶点的顺序定义了可见性。但这是因为它定义了法线的方向。现在看一下这段代码:
var a = new Vector3(0f, 0f, 0f);
var b = new Vector3(0.5f, 0.5f, 0f);
var c = new Vector3(0f, 1f, 0f);
var ab = b - a;
var bc = c - b;
Debug.Log(Vector3.Cross(ab, bc)); // this prints (0.0, 0.0, 0.5)
var ac = c - a;
var cb = b - c;
Debug.Log(Vector3.Cross(ac, cb)); // this prints (0.0, 0.0, -0.5)
注意,在第二种情况下,
z为负,因此它指向您(您的相机可能设置为(0,0,-10)或类似的值)。因此,如果以这种方式定义三角形,您将能够看到它。
长话短说:要知道是否可以看到三角形,请测试顶点的叉积的z分量的信号。如果结果不是您想要的信号,请反转顶点。
我没有从三角剖分函数中读取代码,但我看到它正在使用2D。这意味着可以进一步简化它。它似乎也在计算InsideTriangle()
中的叉积,因此您可能可以使用已经进行的计算来检查信号,而性能损失几乎为零。