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了。

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

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity是一款功能强大的游戏开发引擎,它可以使用脚本语言编写代码来实现各种功能。在Unity,我们可以使用Mesh来绘制多边形。 首先,我们需要创建一个空物体,然后在其上添加一个MeshFilter和一个MeshRenderer组件。MeshFilter用来存储多边形的顶点信息,而MeshRenderer用于显示多边形。 接下来,我们需要使用代码来动态构建多边形的顶点和三角形索引。我们可以使用Vector3数组来存储多边形的顶点位置,并且使用int数组来存储多边形的三角形索引。 例如,我们想要绘制一个矩形,可以通过以下步骤来实现: 1. 创建一个Vector3数组来存储矩形的四个顶点的位置。 Vector3[] vertices = new Vector3[4]; 2. 设置矩形的四个顶点的位置。 vertices[0] = new Vector3(0, 0, 0); vertices[1] = new Vector3(1, 0, 0); vertices[2] = new Vector3(0, 1, 0); vertices[3] = new Vector3(1, 1, 0); 3. 创建一个int数组来存储矩形的两个三角形的顶点索引。 int[] triangles = new int[6]; 4. 设置矩形的两个三角形的顶点索引。 triangles[0] = 0; triangles[1] = 2; triangles[2] = 1; triangles[3] = 2; triangles[4] = 3; triangles[5] = 1; 5. 将顶点数组和三角形索引数组赋值给MeshFilter的mesh属性。 Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.vertices = vertices; mesh.triangles = triangles; 6. 最后,我们需要更新Mesh的各种属性,例如法线、UV坐标等。 mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.RecalculateTangents(); 通过上述步骤,我们就可以在Unity动态构建Mesh并绘制多边形了。当然,根据实际需求,我们可以使用更复杂的算法来构建更复杂的多边形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值