Unity3D-Mesh创建中三角形索引的算法

解释一下上一篇中Mesh的三角形索引算法。

首先是要知道顶点数组是如何产生的:


如此图,一个大矩形,是由6个顶点,两个矩形构成的。

一般来讲,构建此矩形,需要知道每个顶点的位置,以及顶点和顶点之间的关系。

ok,

    // 初始化顶点位置
    private void initVertexPos()
    {
        int currentIndex = 0;

        for (int i = 0; i < ConstNumber.YLength; i++)
        {
            for (int j = 0; j < ConstNumber.XLength; j++)
            {
                vertices[currentIndex] = new Vector3(j, 0, i);
                currentIndex++;
            }
        }
    }

这一步,就是讲顶点的位置按一定的次序排列进数组


那么,索引数组就是存这些0,1,2,3...这些顶点数组索引值。

已知,三角形有3个顶点,所以每3个为一组,构造一个三角形。

矩形由两个三角形产生,可以如图划分,也可以垂直于黄线

那么,我们规定按顺时针方向构造(注意,要么全顺时针,要么全逆时针)

得到 0,3,4,0,4,1,1,4,5,1,5,2


实现的算法就是

    // 初始化三角形索引
    private void initTriangles()
    {
        // 代表triangl数组当前索引值,每放入数组中一个值,currentIndex都增1
        int currentIndex = 0;
        
        for (int i = 0; i < ConstNumber.YLength - 1; i++)
        {
            for (int j = 0; j < ConstNumber.XLength - 1; j++)
            {
                // 顺时针画左上角三角形
                triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 0);
                triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 0);
                triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 1);

                // 顺时针画右下角三角形
                triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 0);
                triangles[currentIndex++] = (i + 1) * ConstNumber.XLength + (j + 1);
                triangles[currentIndex++] = (i + 0) * ConstNumber.XLength + (j + 1);

            }
        }
         
    }



这是一种实现方式,是以整体的矩形来分析。

我自己还写了另外一种索引算法,是以矩形左下角为基准,表达整个矩形。

因为你知道了矩形的一个点,矩形单位长度为1,你就可以知道其他点的位置。

ok,看算法

    // 初始化三角形索引
    private void initTriangles()
    {
        float xdelta = 1.0f / (float)(ConstNumber.XLength - 1);
        float ydelta = 1.0f / (float)(ConstNumber.YLength - 1);
        int currentPosNum = 0;
        for (int i = 0; i < ConstNumber.YLength; i++)
        {
            for (int j = 0; j < ConstNumber.XLength; j++)
            {
                vertices[currentPosNum] = new Vector3(j * xdelta, 0, i * ydelta);
                currentPosNum++;
            }
        }
         
    }


这个样,只需要遍历一遍所有的顶点(而且有些顶点无需遍历)只有一层for就OK了。

不过它的缺点也和它的优点一样明显,就是长必须大于宽。

其实,是可以弥补的,不过今天事情太多了,我只做记录了~~~~

猜你喜欢

转载自blog.csdn.net/lihuozhiling/article/details/43453435