Unity网格三角形翻转

时间:2016-09-07 16:11:30

标签: c# unity3d mesh

我正在尝试创建一个接收高度贴图的函数,然后根据输入创建一个等距网格。我得到它可以很容易地制作代表立方体顶部的三角形,但让它沿着立方体的两侧向下移动是我似乎遇到麻烦的地方。功能不完整,只有两个方面,因为我在完成它之前遇到了麻烦。

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

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

我对网格和3D一般都很陌生,虽然这比它原来要容易得多。我也很确定我映射紫外线的方式是完全错误的,但这是稍后会发生的事情。

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

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

http://imageshack.com/a/img924/9072/HdrZFm.png

谢谢你的帮助。 https://imageshack.us/i/poHdrZFmp

1 个答案:

答案 0 :(得分:0)

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

三角形可见的哪一侧由其顶点索引的方向决定。默认情况下,如果它们按顺时针方向排列,则三角形被认为是面向前方且可见的。逆时针三角形被丢弃,因此我们不需要花时间渲染物体的内部,这通常不会被看到。

所以你必须确保顶点索引方向是顺时针方向。

你的另一个长线问题是在将其指定给三角形之前尝试更改索引顺序。像012到120一样确定方向。