我的程序在运行时收到一个网格。网格可以由超过200k的顶点组成。
我需要将其反转(由内而外)。我反转了索引,但是我还需要反转法线。到目前为止,我使用了以下循环:
Vector3[] newnormals=new Vector3[mesh.normals.Length];
for (int i=0;i<mesh.normals.Length;i++)
{
newnormals[i] = -mesh.normals[i];
}
revMesh.normals = newnormals;
其中“ mesh”是原始Mesh,当然“ revMesh”是反向的。
我不知道为什么,但是这个循环非常慢。我的i7需要花几秒钟的时间。如果我用
revMesh.RecalculateNormals();
执行时间降至100毫秒以下。…
为什么我的例行程序效率如此低下?有什么办法可以加快速度吗?
最佳答案
也许在每次迭代中获取mesh.normals[i]
都会使其变慢,请尝试:
Vector3[] newnormals= revMesh.normals;
for (int i=0;i<newnormals.Length;i++)
newnormals[i] = -newnormals[i];
revMesh.normals = newnormals;
注意:要更改法线,从网格物体复制法线很重要。一旦复制并更改了法线,即可将法线重新分配给网格。
https://docs.unity3d.com/ScriptReference/Mesh-normals.html
您也可以这样做:(没有测试,但我认为它可行)
using System.Linq;
revMesh.triangles = revMesh.triangles.Reverse().ToArray();