这个需求可能比较古怪,一般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. 分析 ThreadLocal 内存泄漏问题

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可能会导 ...

  2. 行为类模式(四):迭代器(Iterator)

    定义 提供一种方法访问一个容器(container)对象中的各个元素,而又不暴露该对象的内部细节. UML 优点 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通 ...

  3. Android 支付宝接口调用

    在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台 转载请注明出处:http://blog.csdn.net/ht_android/article/details/45307165 ...

  4. vue项目的搭建

    ps: 想了解更多vue相关知识请点击VUE学习目录汇总 Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过 ...

  5. SqlServer select * into 对应 Oracle语法

    创建新表,并插入旧表值 Sql Server select * into new_emp from emp; Oracle create table new_emp as select * from ...

  6. 代码重定位和位置无关码——运行于nor flash

    通过前面的学习,我们知道,把可执行程序从一个位置复制到另一个位置的过程叫做重定位. 现在有两种方式,第一种是只重定位data段到内存(sdram),为什么需要重定位?因为有些flash的写操作,不是简 ...

  7. s3c2440内存控制器与SDRAM基本测试

    前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...

  8. Android MPAndroidChart LineChart 显示数据格式化

    最近帮助同学,使用MPAndroidChart 控件,在图表显示时候, class MyValueFormatter implements IValueFormatter { @RequiresApi ...

  9. [转]自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  10. BAT-局域网内在线电脑IP

    相关资料:朋友发来的,来源不明. 问题现象:有个朋友问我都在一个内网中,电脑A没有显示器,怎么找到它的IP. 问题处理: 1.登陆路由器查看IP在线情况. 2.用BAT文件显示出在线IP. 显示局域网 ...