繁体   English   中英

单位网格三角形翻转

[英]Unity mesh triangles flipped

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

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

似乎有时还会制作一个正方形,从网格的一侧延伸到另一侧,留下那些长线。

总的来说,我真的是网格和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)
                {
                    ;
                }
            }
        }
    }

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM