Unity Mesh Renderer在错误的一侧生成多边形

问题描述 投票:1回答:1

因此,我需要使用具有n个顶点的Unity Mesh组件生成多边形。我正在使用一个自定义Triangulate()函数,该函数能够找到mesh.triangles的索引。

问题是,根据我提供的函数的顶点,多边形会在错误的一侧生成,并且有时对照相机不可见(除非我将照相机翻转到另一侧)。

现在,我知道这与Unity的顺时针缠绕顺序有关,但是无论我输入的顶点如何,如何确保多边形始终在正确的一侧生成?还是有办法知道生成网格的哪一侧,以便我可以相应地调整相机?

The Triangulator function I use

c# unity3d mesh
1个回答
0
投票
n:

enter image description here

三角形的可见性基于其法线。计算命中三角形,被反射并进入您的眼睛的光的数学运算(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()中的叉积,因此您可能可以使用已经进行的计算来检查信号,而性能损失几乎为零。
© www.soinside.com 2019 - 2024. All rights reserved.