对于这种长期张贴的方式,我事先表示歉意。
我正在使用C#函数为Unity3D项目统一网格的三角形方向。我使用Vector3
类型,它是由float array [3]
组成的结构。
为此,我采取了第一个三角形,并检查它是否指向过大或向内。在那之后,我检查一个正切的并检查三角形的索引的顺序。如果按顺序找到几个索引,则将它们翻转。 这里是一个例子:
1 2 3
1 2 4
(1 2
与基本三角形的顺序相同,需要翻转到2 1 4
)4 2 1
(2 1
的顺序不同,然后什么也不做)检查返回我下一个三角形以检查是否找到;否则返回空向量。
如果“ next”不为空,则将“ next”三角形改为“ current”,我将固定三角形存储在变量中,以避免程序继续检查相同的索引并再次重复检查。 />
问题在于某些变量似乎在指令弄乱我的条件之前会更新它们的值。
正如您在下面的代码中看到的那样,我有一个非常复杂的If语句,该语句试图查找两个三角形的索引是否以相同的顺序(不一定是相同的位置)出现:
1 2 3 (base)
以下所有可能的结果都需要翻转到
1 2 4 -> 2 1 4
4 1 2 -> 1 4 2
2 4 1 -> 4 2 1
需要在mesh.Index[]
之前加上减号,因为它似乎使用了IndexList
的值,而不是mesh.Index
的值,我也不知道为什么。
我正在使用此自定义结构在Unity外部测试程序
public struct SimplifiedMesh
{
//this stores the order of the vertices needed to
//create all the triangles of the mesh.
public int[] Index;
it list all the vertices of the mesh
public Vector3[] Vertex;
};
IndexList
用于存储选中的三角形。最初,所有值都是正值,但是当选中一个值时,它会将其索引变成负值。
int[] IndexList = new int[Unimesh.Index.Length]; IndexList = Unimesh.Index;
首先,我使用另一种方法进行检查,以确定面部是朝外还是朝内
FirstCheck(Unimesh, CentreofMesh, currentIndices);
//this will tell the program this triad is already checked
IndexList[currentIndices[0]] *= -1;
IndexList[currentIndices[0] + 1] *= -1;
IndexList[currentIndices[0] + 2] *= -1;
以下是困难的部分。这里是变量的传说:
currentIndices
是Array[3]
,用于存储mesh.Index
数组中最后一个选中的三角形的三个索引的位置。它曾经被用来寻找一个切线的人; next
是返回变量,该变量返回要考虑进行检查的下一个向量;如果没有找到任何三角形,则返回null。mesh.Index[currentIndices[0-1-2]
是当前索引FlipNormals
获取网格索引,转到“ Flipvector”指向的三个索引,然后交换前两个,颠倒它们的顺序这里是代码
static int[] AdiacentFace(SimplifiedMesh mesh, int[] IndexList, int[] currentIndices)
{
int[] next = new int[3];
for (int i = 0; i < IndexList.Length; i += 3)
{
if (IndexList[i] > 0 || IndexList[i + 1] > 0)
{
if
// e restituisce la nuova terna modificata
((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])))
{
int[] Flipvector = new int[3];
Flipvector[0] = mesh.Index[i];
Flipvector[1] = mesh.Index[i+1];
Flipvector[2] = mesh.Index[i + 2];
FlipNormals(mesh, Flipvector);
// Elimina la terna per i successivi controlli
IndexList[i] *= -1;
IndexList[i + 1] *= -1;
IndexList[i + 2] *= -1;
// Ritorna gli indici del nuovo vettore
next[0] = i;
next[1] = i + 1;
next[2] = i + 2;
return next;
}
else if
((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
(IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])))
{
// Elimina la terna per i successivi controlli
IndexList[i] *= -1;
IndexList[i + 1] *= -1;
IndexList[i + 2] *= -1;
// Ritorna gli indici del nuovo vettore
next[0] = i;
next[1] = i + 1;
next[2] = i + 2;
return next;
}
}
}
next = null;
return next;
}
答案 0 :(得分:0)
我找到了解决方案。 我是C#的初学者,我不知道数组之间的操作“ IndexList = Unimesh.Index”会传递引用而不是单个值。 我设法以这种方式解决了这个问题。 发件人:
int[] IndexList = new int[Unimesh.Index.Length]; Indexlist = Unimesh.Index;
收件人:
int[] IndexList = new int[Unimesh.Index.Length];
For (int i = 0; i < Unimesh.Index.Length; i++)
{
IndexList[i] = Unimesh.Index[i];
}
这样,我只复制值,而不复制对数组的引用。