我很难用英语解释。 一般来说,我正在研究一些算法来将小网格组合成大网格。我注意到的一件事是,如果网格的变换在一个轴上具有负比例,并且我将顶点乘以变换矩阵,则网格的面将被翻转。通过在 X 轴上具有负比例的立方体上使用 Unity UnityMeshSimplifier.MeshCombiner 可以轻松制作示例。 背后的原因很简单 - 例如,由 (1, 0)、(2, 0)、(2, 1) 构成的逆时针三角形被矩阵翻转,只需将 x 轴缩放 - 1,结果将是 (-1, 0), (-2, 0), (-2, 1),这是顺时针方向。 因此,通过检查最终网格顺时针顺序中是否有任何三角形与原始三角形不匹配,可以轻松找到简单的解决方案。
据我测试,如果一个三角形顺时针顺序改变,所有其他三角形都会相同。但我无法证明它或反驳它。如果可以证明的话,我可以只检查第一个三角形,而不是全部。
目前我认为它应该可行,因为三角形的法线只能是两个方向。有人可以帮忙吗?
问题可以简化为:通过给定 Matrix4x4 矩阵(TRS 矩阵)和 2 Vector3 a, b(方向)。如果 Vector3.Cross(matrix.MultiplyVector(a), matrix.MultiplyVector(b)) == -maxtrix.MultiplyVector(Vector3.Cross(a, b)),则它适用于任何给定方向 a 和 b。
嗯,一般来说,是的,尽管这听起来可能违反直觉。例如,垂直于翻转轴的三角形(就像 y-z 平面上的三角形),它的任何顶点实际上都不会改变位置,并且缠绕顺序也将保持不变。然而,如果它是封闭体积的一部分,三角形仍然会面向错误的方向。
想象一个网格位于坐标系的右侧,而位于网格左侧的边界三角形将面向左侧。当您翻转整个对象时,整个对象现在将位于坐标系的左侧,并且相同的边界三角形现在会闭合右侧的网格,而不再是左侧。所以它现在应该面向右侧而不是左侧。所以也需要翻转。
一般当你在奇数轴(1或3)上翻转时,网格会翻转,三角形需要翻转。只有当您在两个轴上翻转时,它才会保持不变,因为每次翻转都需要翻转三角形。所以翻转两次当然会互相抵消。
矩阵的行列式会告诉你它是否翻转面积/体积。当行列式为负数时,它会翻转空间,如果行列式为正数,则不会翻转空间。