这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息。

  最开始我想的是自己分析Mesh里的VertexData与IndexData,分析顶点时查找源码发现Ogre里本身有相关的类,这里Axiom3D与Ogre的源码有些区别,不过大致意思相同。

  主要用到的类:EdgeListBuilder,CommonVertexList,EdgeData。

  流程很简单,EdgeListBuilder添加Mesh,分析Mesh里的顶点与索引缓冲,调用方法Build生成CommonVertexList与EdgeData。下面让我们来看下具体流程。

  首先我们要注意到,不管是Mesh或是别的可渲染元素,并不一定是一个VertexData(顶点缓冲)对应一个IndexData(索引缓冲),如Mesh几个SubMesh共用VertexData的情况。所以EdgeListBuilder保存了一个VertexDataList与IndexDataList,中间还有一个关联性列表,在Ogre中是一个Geometry结构,包装顶点索引IndexData,顶点索引列表索引indexSet,顶点缓冲列表索引vertexSet,顶点索引渲染方式OperationType。在Axiom里,是一个和顶点索引IndexDataList长度一样的对应整形数组indexDataVertexDataSetList,其实和Ogre一样,在IndexDataList里的索引直接放入indexDataVertexDataSetList就能得到vertexSet.也还有一个OperationTypeList,同理,长度与IndexDataList一样。

  再说CommonVertex,这个结构只有五个字段,分别是vector3类型的position(顶点位置),index(在对应IndexData里的索引),vertexSet(VertexDataList里的索引),indexSet(IndexDataList里的索引),originalIndex(在CommonVertexList里的索引).大家不要搞混了几个带index的索引.假设我要找第二个索引缓冲区里第六个数据对应在顶点索引的值,那么在这个里面,indexSet=2,index=6.大致就是IndexDataList[2][6]这个值.设p=IndexDataList[indexSet][index],我们要在对应顶点索引的值,就如下计算VertexDataList[vertexSet][p]就是这个顶点的值了. 还有一种更简单的方法,CommonVertexList包含了顶点位置,而CommonVertex里的originalIndex是指向CommonVertexList的索引,所以可以直接从CommonVertexList[originalIndex]得到顶点位置,如果只考虑顶点位置不考虑法线,纹理坐标,颜色等,这将是一个更好的选择.

  EdgeData主要包含二个列表,一个是TriangleList(三角形列表),一个是EdgeGroupList列表,其中一个EdgeGroup对应一个vertexData,多个Edge.Edge好理解,就是我们要的边,二点一线,属性分别是triIndex(TriangleList中的索引),一边可以供二个三角形共享.vertIndex(对应EdgeGroup里的vertexData里的位置).sharedVertIndex(对应CommonVertexList)里的索引.

  EdgeListBuilder的Build方法,就是填充上面的CommonVertexList与EdgeData的关系.

  调用Build后,首先与VertexDataList里的VertexData对应一一生成EdgeGroup,然后根据索引缓冲集合(IndexDataList)生成三角形网格,索引是告诉GPU如何渲染的,在这里,也就是告诉我们如何生成三角形的.

  在这里生成三角形有一个焊接的过程,可能会合并顶点,合并顶点有五种策略,一是合并所有,二是合并在同一索引缓冲区的,三是合并在同一顶点缓冲区的,四是合并相同顶点缓冲与索引缓冲区的,五不合并.在这里,首先会选择一合并所有,然后是二,三四,五.在合并1-4的时候会减少顶点,这样可能会产生一个问题,原来都是三角形二二间共用一边,但是合并后,可能会造成超过二个三角形共用一边,这样就会造成不合法的网格.所以差不多是这样,一如果合并的顶点不造成错误网络,就用第一个策略,否则会采用第二个,一直到最后的第五种策略.

  生成完三角形后,根据三角形生成对应的边Edge.

  从Ogre与Axiom3D里对这些的引用来看,主要是用于阴影计算,我也是用于偏门,用来展示模型的点,线,面等元素.但是按照EdgeListBuilder实现的功能来看,我们可以把一些相同材质的模型合并成一个模型(有些局限,模型顶点包含的信息最好只有顶点位置,法线),在Ogre与Axiom3D也没看到有此的相关应用,可能这个想法不太完善,我会在后面尝试这个效果. 

  其中顶,线,面相关分解也只是一个初稿,故相关代码就暂时不放了,等综合考虑相关功能定下相应方法属性后再给出如何分解重组的代码.

Axiom3D:Ogre中Mesh网格分解成点线面。的更多相关文章

  1. Axiom3D:Ogre中Mesh文件格式分析(一)

    在Axiom3D,或者说是Ogre的mesh的文件格式我们可能通过代码反推出相关格式,相关过程本来我是直接写的,后面发现相关流程写完后,我自己都看晕了,然后我就把一些过程用Execl整理出来,发现过程 ...

  2. 关于Unity中Mesh网格的详解

    3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...

  3. Ogre中Mesh的加载过程详述

    转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...

  4. Axiom3D:Ogre公告板集与合并批次

    在上文中,我们把Ogre里的网格分解成点线面后,我们要完成一个新的功能,在点上突出显示. 得到顶点位置后,这个功能也就是一个很简单的事,最开始是每个顶点添加一个子节点,节点上添加一个圆点. forea ...

  5. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  6. 萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  7. C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  8. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  9. Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.

    在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点 ...

随机推荐

  1. 【Unity】第8章 GUI开发

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 前面的章节中实际上已经多次使用了GUI,只不过用法都比较简单,这一章系统地介绍Unity 5.x自带的GUI(称为Uni ...

  2. HTML5学习笔记(二十二):DOM

    DOM即文档对象模型(Document Object Model),其定义了访问和操作 HTML 文档的标准方法. DOM 将 HTML 文档表达为树结构,如下: 通过DOM,开发人员可以动态的添加. ...

  3. Quantum Computation and Quantum Information

    https://www.amazon.com/Quantum-Computation-Information-10th-Anniversary/dp/1107002176/ref=asap_bc?ie ...

  4. iOS-通讯录(无界面)

    通讯录(无界面) #import "AppDelegate.h" #import <AddressBook/AddressBook.h> @interface AppD ...

  5. Android,XML解析

    XML解析三种方式 DOM 通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树.检索所需的数据: 简单直观,但需要将文档读取到内存,并不太适合移动设备: SAX ...

  6. DLL中获取主程序句柄

    一.问题由来及说明 在实际编程中遇到一些系统模块(或API)调用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易获得,比如mfc中可以直接调用AfxGetMainWnd().GetS ...

  7. HP管理工具System Management Homepage安装配置

    如果用HP的启动光盘进行系统安装时,HP SMH 及相关组件会自动安装完成,但如果是用操作系统光盘进行系统安装,则HP SMH相关组件需要手动进行安装及相关设置!HP SMH由三部分组成:HP Sys ...

  8. spring 强制采用cglib进行代理

    spring对AOP的支持 *如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP* 如果目标对象实现了接口,可以强制使用CGLIB实现AOP*如果目标对象没有实现了接口,必须采用CGL ...

  9. sphinx增量索引和主索引来实现索引的实时更新

    项目中文章的信息内容因为持续有新增,而文章总量的基数又比较大,所以做搜索的时候,用了主索引+增量索引这种方式来实现索引的实时更新. 实现原理: 1. 新建一张表,记录一下上一次已经创建好索引的最后一条 ...

  10. 【Unity笔记】寻路导航Navigation中的区域Areas与消耗Cost

    Navigation寻路导航界面下,Areas分页下是在给导航区域分类(相当于分层),以及为每个分类设置不同的消费Cost,意义在于,导航算法中会计算出的是累加起来消耗最低的路径(不一定是视觉上最短可 ...