这个需求可能比较古怪,一般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. WCF推送

    http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html

  2. mongodb学习比较(数据操作篇)

    1.  批量插入:     以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封 ...

  3. DataTable的初始化与事件注册

    TypeScript代码: let tabledata = data as any[]; if (this.dataTable) { this.dataTable.clear(); this.data ...

  4. 银联在线支付B2C UnionPay.NET

    新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领 ...

  5. angular学习笔记(三十)-指令(7)-compile和link(3)

    本篇接着上一篇来讲解当指令中带有template(templateUrl)时,compile和link的执行顺序: 把上一个例子的代码再进行一些修改: 1.将level-two指令改成具有templa ...

  6. [Windows Azure]The Autoscaling Application Block

    The Autoscaling Application Block             5 out of 6 rated this helpful - Rate this topic        ...

  7. C# 类型实例化的语法糖--unity下诡异结果

    类型实例化语法糖就是如下的用法: public class Abc { public int ID { get; set; } public string Name { get; set; } pub ...

  8. Unique constraint on single String column with GreenDao2

    转:http://software.techassistbox.com/unique-constraint-on-single-string-column-with-greendao_384521.h ...

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

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

  10. Loadrunner集合点Rendezvous知识

    摘自: http://blog.csdn.net/richnaly/article/details/7967364 集合点的意思时等到特定的用户数后再一起执行某个操作,比如一起保存,一起提交(我们通常 ...