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

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

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

时间: 2024-10-31 23:14:42

Unity3D-Mesh创建中三角形索引的算法的相关文章

Unity3D 动态创建Mesh(一)

1.Mesh.MeshFilter.MeshRenderer关系整理 在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter.MeshRenderer组件. MeshFilter含有一个Public成员 Mesh. 在Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[]).triangles(三角形顶点索引数组,int[]).normals(法线向量数组,Vector3[]).uv(纹理坐标数组,Vector2[]). 2.使用M

(转载)ORA-14452:试图创建,更改或删除正在使用的临时表中的索引

因为表kol_xx_fin050_temp 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba_objects / user_objects中查询到该表的object_id: select object_id from dba_objects where object_name=upper('kol_xx_fin050_temp'); 2.根据查到的object_id知道使用该表的session: select * from v$lock where id1=&objec

SqlServer中创建非聚集索引和非聚集索引

聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索引,所以一张表中只能出现一个聚集索引. 聚集索引的特征:代表全部数据存储的位置索引,不能经常去更新这个字段,最好不出现重复. 聚集索引 非聚集索引也有很多人叫法上细分为唯一索引.全文索引.普通索引,我们在进项条件查询时,作为条件过滤的字段通常被设置为非聚集索引,这样就不需要去读取原始记录,直接查询索

创建高性能的索引

索引可以包含一个或多个列的值.若索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效的使用索引的最左前缀列. 在MySQL中,索引是在存储引擎层而不是服务层实现的,所以并没有统一的索引标准.不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引.即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同. B-Tree索引 若没有指定特定类型的索引,则一般都是指的是B-Tree索引,它使用B-Tree数据结构来存储数据.InnoDB使用的是B+Tree.MyI

数据结构基础温故-5.图(中):最小生成树算法

图的“多对多”特性使得图在结构设计和算法实现上较为困难,这时就需要根据具体应用将图转换为不同的树来简化问题的求解. 一.生成树与最小生成树 1.1 生成树 对于一个无向图,含有连通图全部顶点的一个极小连通子图成为生成树(Spanning Tree).其本质就是从连通图任一顶点出发进行遍历操作所经过的边,再加上所有顶点构成的子图. 采用深度优先遍历获得的生成树称为深度优先生成树(DFS生成树),采用广度优先遍历获得的生成树称为广度优先生成树(BFS生成树).如下图所示,无向图的DFS生成树和BFS

《高性能MySQL》读书笔记之创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询.5.1 索引基础 在MySQL中,存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列. 5.1.1 索引的类型 索引有很多类型,可以为不同的场景提供更好的性能.在MySQL中,索引是在储存引擎层而不是

Oracle中B-TREE索引的深入理解(转载)

索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书,其中书的内容就相当于表里的数据,而书前面的目录就相当于该表的索引.同时,通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性.但是,索引作为一种可选的数据结构,你可以选择为某个表里的创建索引,也可以不创建.这是因为一旦创建了索引,就意味着o

高性能MySQL——创建高性能的索引

索引是存储引擎用于快速查找记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 1.索引的类型 在MySQL中,索引是在存储引擎层而不是服务器层实现的.所以没用统一的索引标准,不同存储引擎的索引工作方式并不相同. B-Tree索引 B-Tree索引即使用B-Tree数据结构来存储数据.B-Tree通常意味着所有值都是按顺序存储的,并且每个叶子页到根的距离相同.存储引擎已不同的方式来使用B-Tree索引,性能也各不相同. 可以使用B-Tree索引的查询类型--全键值.键值范围和键前缀查找.其

MySQL数据库中的索引(一)——索引实现原理

今天我们来探讨一下数据库中一个很重要的概念:索引. MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,即索引是一种数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary searc