变量值在我发出该指令之前会更新

时间:2019-04-02 12:37:02

标签: c# unity3d mesh

对于这种长期张贴的方式,我事先表示歉意。 我正在使用C#函数为Unity3D项目统一网格的三角形方向。我使用Vector3类型,它是由float array [3]组成的结构。

为此,我采取了第一个三角形,并检查它是否指向过大或向内。在那之后,我检查一个正切的并检查三角形的索引的顺序。如果按顺序找到几个索引,则将它们翻转。 这里是一个例子:

  • 基本三角形的索引:1 2 3
  • 第二个三角形的索引:
    • 1 2 41 2与基本三角形的顺序相同,需要翻转到2 1 4
    • 4 2 12 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;

以下是困难的部分。这里是变量的传说:

  • currentIndicesArray[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;
}

1 个答案:

答案 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];
    }

这样,我只复制值,而不复制对数组的引用。