【问题标题】:Unity mesh triangles flippedUnity 网格三角形翻转
【发布时间】:2017-01-15 10:25:44
【问题描述】:

我正在尝试制作一个接收高度图的函数,然后根据输入创建单个等距网格。我得到它来相当容易地制作代表立方体顶部的三角形,但是让它沿着立方体的侧面下降是我似乎遇到麻烦的地方。该功能不完整,并且在完成之前遇到了麻烦,只制作了两个方面。

基本上似乎正在发生的事情是一些三角形被翻转,而另一些则没有,我不知道为什么。您可以看到有些边的两个三角形都朝向相同的方向,而另一些边只有一个三角形可见,因为正方形的第二个朝向另一个方向。

它似乎偶尔也会制作一个正方形,从网格的一侧延伸到另一侧,留下那些长线。

总的来说,我对网格和 3d 非常陌生,尽管这比实际情况要容易得多。我也很确定我映射 UV 的方式是完全错误的,但那将在以后出现。

public static MeshData generateIsoMesh(float [,] heightMap, int heightMax, AnimationCurve heightCurve)
{
    int height = heightMap.GetLength(0);
    int width = heightMap.GetLength(1);

    int triangleNum = 0;

    int blockHeight = 0 ;
    int nextHeight = 0;
    int heightDif = 0;

    List<Vector3> vecList = new List<Vector3>();
    List<int> triangleList = new List<int>();
    List<Vector2> uvList = new List<Vector2>();



    for (int y = 0; y < height; y ++)
    {
        for (int x = 0; x < width; x ++)
        {

            blockHeight = ((int)(heightMap[x, y]*10)) * heightMax;

            vecList.Add(new Vector3(x, blockHeight , y));
            vecList.Add(new Vector3(x, blockHeight, y+ 1));
            vecList.Add(new Vector3(x+1, blockHeight, y+1));
            vecList.Add(new Vector3(x + 1, blockHeight, y));

            uvList.Add(new Vector2(x / (float)width, y / (float)height));
            uvList.Add(new Vector2(x / (float)width, y / (float)height));
            uvList.Add(new Vector2(x / (float)width, y / (float)height));
            uvList.Add(new Vector2(x / (float)width, y / (float)height));

            if ((x < width-1) && (y < height-1))
            {
                triangleList.Add(triangleNum);
                triangleList.Add(triangleNum + 1);
                triangleList.Add(triangleNum + 2);

                triangleList.Add(triangleNum );
                triangleList.Add(triangleNum + 2 );
                triangleList.Add(triangleNum + 3);
                triangleNum += 4;
            }
            if (x < width-1 && x > 3 && x > 0)
            {

                nextHeight = ((int)(heightMap[x+1,y]*10)) * heightMax;
                heightDif = (nextHeight - blockHeight)/heightMax;
                if (heightDif > 0)
                {
                    for (int z = 0; z < heightDif; z ++)
                    {
                        uvList.Add(new Vector2(x / (float)width, y / (float)height));
                        uvList.Add(new Vector2(x / (float)width, y / (float)height));
                        vecList.Add(new Vector3(x + 1, blockHeight - (1 + z), y));
                        vecList.Add(new Vector3(x + 1, blockHeight - (1 + z), y + 1));

                        triangleList.Add(triangleNum - 1);
                        triangleList.Add(triangleNum - 2);
                        triangleList.Add(triangleNum + 1);

                        triangleList.Add(triangleNum - 1);
                        triangleList.Add(triangleNum + 1);
                        triangleList.Add(triangleNum    );
                        triangleNum += 4;

                    }
                }
                else if (heightDif < 0)
                {
                    ;
                }
            }
        }
    }

输出网格:和没有执行降级代码的循环的相同网格

感谢您的所有帮助。 https://imageshack.us/i/poHdrZFmp

【问题讨论】:

    标签: c# unity3d mesh


    【解决方案1】:

    正如您所说,问题出在渲染中,其原因可能是顶点索引的方向。

    三角形从哪一侧可见取决于其顶点索引的方向。默认情况下,如果它们以顺时针方向排列,则三角形被认为是向前且可见的。逆时针三角形被丢弃,因此我们不需要花时间渲染对象的内部,这些内部通常无论如何都不会被看到。

    因此,您必须始终确保顶点索引方向是顺时针方向。

    您的其他长线问题尝试在将索引顺序分配给三角形之前更改索引顺序。像 012 到 120 一样,请确定方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多