行军立方体绘制三角形团结
marching cubes drawing triangles unity
我正在尝试在我的游戏中实现行进立方体,到目前为止,我已经建立了一个系统来绘制世界中有四个点的三角形 space。我已经让系统在我设置点的地方工作,但是当我画两个三角形使它成为一个网格时,它只画了一个,但我设置了一个 print()
语句,它显示 2 个三角形是每次都画,这样很正常。我不知道我需要做什么。这是我的代码,如果您需要更多,请对此 post 进行评论 pics/code:
private void Triangulate()
{
vertices.Clear();
triangles.Clear();
mesh.Clear();
TriangulateCellRows();
print(triangles.Count);
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
}
private void TriangulateCellRows()
{
int cells = resolution - 1; int heightCells = heightRes - 1;
for (int i = 0, y = 0; y < heightCells; y++)
{
for (int x = 0; x < cells; x++, i++)
{
for (int z = 0; z < cells; z++, i++)
{
TriangulateCell(
voxels[i],
voxels[i + 1],
voxels[i + resolution],
voxels[i + resolution + 1],
voxels[i + resolution * resolution],
voxels[i + resolution * resolution + 1],
voxels[i + resolution * resolution + resolution],
voxels[i + resolution * resolution + resolution + 1]);
}
}
}
}
private void TriangulateCell(Voxel a, Voxel b, Voxel c, Voxel d, Voxel e, Voxel f, Voxel g, Voxel h)
{
int cellType = 0;
if (a.state)
{
cellType |= 1;
}
if (b.state)
{
cellType |= 2;
}
if (c.state)
{
cellType |= 4;
}
if (d.state)
{
cellType |= 8;
}
if (e.state)
{
cellType |= 16;
}
if (f.state)
{
cellType |= 32;
}
if (g.state)
{
cellType |= 64;
}
if (h.state)
{
cellType |= 128;
}
switch (cellType)
{
case 0:
return;/*
case 1:
AddTriangle(a.xEdgePosition, b.yEdgePosition, c.zEdgePosition);
break;*/
case 15:
AddQuad(a.yEdgePosition, b.yEdgePosition, c.yEdgePosition, d.yEdgePosition);
print(a.yEdgePosition + "- " + b.yEdgePosition + "- " + c.yEdgePosition + "- " + d.yEdgePosition);
print(a.position + "/ " + b.position + "/ " + c.position + "/ " + d.position);
break;
}
}
...
private void AddQuad(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
{
int vertCount = vertices.Count;
vertices.Add(a);
vertices.Add(b);
vertices.Add(c);
vertices.Add(d);
triangles.Add(vertCount);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 3);
print(triangles.Count);
}
我很确定你的问题是订单。
Unity 使用 clockwise winding order。这意味着
如果您按顺时针方向提供三角形,法线将朝向您,您将看到三角形。
如果您提供三角形逆时针顺序,法线将背对您,您将看不到三角形。
现在看看你的代码(至少据我所知)你的顶点看起来有点像
C--D
|\ |
| \|
A--B
你的三角形是 A-B-C 和 B-C-D。
所以你可以看到其中一个是逆时针(A-B-C),另一个是顺时针(B-C-D)!
因此,根据您从哪一侧看这些,您将看到一个或另一个,但不会同时看到两者。
你要么宁愿
triangles.Add(vertCount);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 3);
或
triangles.Add(vertCount);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 3);
triangles.Add(vertCount + 2);
取决于您的需要以及生成的三角形应面向哪个方向
我正在尝试在我的游戏中实现行进立方体,到目前为止,我已经建立了一个系统来绘制世界中有四个点的三角形 space。我已经让系统在我设置点的地方工作,但是当我画两个三角形使它成为一个网格时,它只画了一个,但我设置了一个 print()
语句,它显示 2 个三角形是每次都画,这样很正常。我不知道我需要做什么。这是我的代码,如果您需要更多,请对此 post 进行评论 pics/code:
private void Triangulate()
{
vertices.Clear();
triangles.Clear();
mesh.Clear();
TriangulateCellRows();
print(triangles.Count);
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
}
private void TriangulateCellRows()
{
int cells = resolution - 1; int heightCells = heightRes - 1;
for (int i = 0, y = 0; y < heightCells; y++)
{
for (int x = 0; x < cells; x++, i++)
{
for (int z = 0; z < cells; z++, i++)
{
TriangulateCell(
voxels[i],
voxels[i + 1],
voxels[i + resolution],
voxels[i + resolution + 1],
voxels[i + resolution * resolution],
voxels[i + resolution * resolution + 1],
voxels[i + resolution * resolution + resolution],
voxels[i + resolution * resolution + resolution + 1]);
}
}
}
}
private void TriangulateCell(Voxel a, Voxel b, Voxel c, Voxel d, Voxel e, Voxel f, Voxel g, Voxel h)
{
int cellType = 0;
if (a.state)
{
cellType |= 1;
}
if (b.state)
{
cellType |= 2;
}
if (c.state)
{
cellType |= 4;
}
if (d.state)
{
cellType |= 8;
}
if (e.state)
{
cellType |= 16;
}
if (f.state)
{
cellType |= 32;
}
if (g.state)
{
cellType |= 64;
}
if (h.state)
{
cellType |= 128;
}
switch (cellType)
{
case 0:
return;/*
case 1:
AddTriangle(a.xEdgePosition, b.yEdgePosition, c.zEdgePosition);
break;*/
case 15:
AddQuad(a.yEdgePosition, b.yEdgePosition, c.yEdgePosition, d.yEdgePosition);
print(a.yEdgePosition + "- " + b.yEdgePosition + "- " + c.yEdgePosition + "- " + d.yEdgePosition);
print(a.position + "/ " + b.position + "/ " + c.position + "/ " + d.position);
break;
}
}
...
private void AddQuad(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
{
int vertCount = vertices.Count;
vertices.Add(a);
vertices.Add(b);
vertices.Add(c);
vertices.Add(d);
triangles.Add(vertCount);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 3);
print(triangles.Count);
}
我很确定你的问题是订单。
Unity 使用 clockwise winding order。这意味着
如果您按顺时针方向提供三角形,法线将朝向您,您将看到三角形。
如果您提供三角形逆时针顺序,法线将背对您,您将看不到三角形。
现在看看你的代码(至少据我所知)你的顶点看起来有点像
C--D
|\ |
| \|
A--B
你的三角形是 A-B-C 和 B-C-D。
所以你可以看到其中一个是逆时针(A-B-C),另一个是顺时针(B-C-D)!
因此,根据您从哪一侧看这些,您将看到一个或另一个,但不会同时看到两者。
你要么宁愿
triangles.Add(vertCount);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 3);
或
triangles.Add(vertCount);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 2);
triangles.Add(vertCount + 1);
triangles.Add(vertCount + 3);
triangles.Add(vertCount + 2);
取决于您的需要以及生成的三角形应面向哪个方向