【问题标题】:marching cubes drawing triangles unity行进立方体绘图三角形统一
【发布时间】:2021-05-09 05:29:32
【问题描述】:

我正在尝试在我的游戏中实现移动立方体,到目前为止,我已经建立了一个用于在世界空间中绘制具有四个点的三角形的系统。我已经让系统在我设置点的地方工作,但是当我绘制两个三角形以使其成为网格时,它只绘制一个,但我设置了一个 print() 语句,它显示每个绘制了 2 个三角形时间,所以这很正常。我不知道我需要做什么。这是我的代码,如果您需要更多图片/代码,请评论这篇文章:

    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);
    }

【问题讨论】:

    标签: c# unity3d mesh triangulation


    【解决方案1】:

    我很确定您的问题是order

    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);
    

    取决于您的需要以及生成的三角形应朝向的方向

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2017-12-03
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多