这是我的第一个问题,因为这是我多年来第一次无法找到预先存在的答案。
我在Unity中创建程序生成的网格物体。它们需要由一组vector3s(3维点)和一个表示vector3s索引的int数组构建。
我正在使用SortedList来跟踪顶点,以便我可以在单个网格中多次使用它们并对它们应用变形。这是最好的选择,因为它跟踪索引和自定义键类型(在这种情况下为3维位置)
public SortedList<Pos, Vector3> verts = new SortedList<Pos, Vector3>();
public List<int> tris = new List<int>();
出于某种原因,当我跑
时trisOut[0] = verts.IndexOfKey(vertPos[0, 1, 1]);
它在大多数情况下正常运行,但偶尔会返回“-1”,这意味着它无法找到与我的小渲染字段中的匹配位置。这是它找到的一对三角形:
Tri-Set 996 999 -1 996 -1 989
考虑到正在寻找
,这真的很奇怪(13, 7, 16) (14, 7, 16) (14, 7, 15) (13, 7, 16) (14, 7, 15) (13, 7, 15)
我使用我的日志检查了这一点,并且(14, 7, 15)
存在且索引为996,导致我检查其他人。这是块中的最终渲染面:
(15, 7, 16) (16, 7, 16) (16, 7, 15) (15, 7, 16) (16, 7, 15) (15, 7, 15)
以下是它在寻找它们时实际发现的顶点:
(16, 7, 16) (16, 7, 15) (16, 7, 15) (16, 7, 17) (16, 7, 15) (16, 6, 2)
什么?这没有任何意义,考虑到这些是每个结构内部方法的打印输出!它应该能够将自己与其他键(CompareTo)匹配,因为它只检查匹配,而不是它是否大于或小于。 “==”是一个非常简单的操作...
public int CompareTo(Pos c)
{
if (this.x == c.x && this.y == c.y && this.z == c.z)
return 0;
else if (this.x + this.y + this.z < c.x + c.y + c.z)
return -1;
else
return 1;
}
这种情况在6种情况下被调用,每种情况都有6次操作,如下所示
case Direction.up:
trisOut[0] = verts.IndexOfKey(vertPos[0, 1, 1]);//UNW
trisOut[1] = verts.IndexOfKey(vertPos[1, 1, 1]);//UNE
trisOut[2] = verts.IndexOfKey(vertPos[1, 1, 0]);//USE
trisOut[3] = verts.IndexOfKey(vertPos[0, 1, 1]);//UNW
trisOut[4] = verts.IndexOfKey(vertPos[1, 1, 0]);//USE
trisOut[5] = verts.IndexOfKey(vertPos[0, 1, 0]);//USW
Debug.Log("Verts: " + verts.Count);
Debug.Log("looking for " + vertPos[0, 1, 1] + " " + vertPos[1, 1, 1] + " " + vertPos[1, 1, 0] + " " + vertPos[0, 1, 1] + " " + vertPos[1, 1, 0] + " " + vertPos[0, 1, 0]);
Debug.Log("Tri-Set " + trisOut[0] + " " + trisOut[1] + " " + trisOut[2] + " " + trisOut[3]+ " " + trisOut[4] + " " + trisOut[5]);
break;
问题可能出现的另一个地方是我在块周围创建一个迷你块来计算所有8个周围顶点的位置(填充上面使用的数组)。
Pos[,,] vertPos = new Pos[2, 2, 2];
int[] trisOut = new int[6];
Debug.Log("Pos" + pos);
for (int x = 0; x < vertPos.GetLength(0); x++)
{
for (int y = 0; y < vertPos.GetLength(1); y++)
{
for (int z = 0; z < vertPos.GetLength(2); z++)
{
vertPos[x, y, z] = pos;
vertPos[x, y, z].x += x;
vertPos[x, y, z].y += y;
vertPos[x, y, z].z += z;
Debug.Log("VertPos" + vertPos[x, y, z].x + " " + vertPos[x, y, z].y + " " + vertPos[x, y, z].z);
}
}
}
接下来是从这八个中选择四个顶点以形成面的代码。我的顶点生成代码工作正常,我有日志显示每个在它的正确位置,但我的三角形生成算法找到的顶点似乎是以一些非常奇怪的方式偏移。