这个需求可能比较古怪,一般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. node调试的两种方法

    刚开始学node.js的时候,一直在用node-inspector,虽然很麻烦,但聊胜于无.后面公司牛人推荐使用node-webkit,就再也没用过node-inspector.再后来node.js版 ...

  2. Python运维自动化开发之Fabric模块

    本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便.主要用于多台服务器批量执行任务. 非内置Python模块,需要手 ...

  3. 菜鸟学JS(三)——自动隐藏的悬浮框

    今天写一个小实例,用js和css写一个可以自动隐藏的悬浮框.css肯定是用来控制样式的,js用来控制器显示与隐藏的.显示与隐藏通常有两种方法实现:1,用js控制其显示属性:2,用js控制其大小. 今天 ...

  4. hi模板文件报乱码问题

    1.h5模板在: Templates\common 2.出现乱码的都在Templates\common\tags  局部视图里. 3.页面顶部有引用(skin-Common_SubmmitCartPr ...

  5. ashx页面返回json字符串|jQuery 的ajax处理请求的纠结问题

    纠结,整了半天的jquery的ajax请求数据. 遇到的问题: 1 ajax方法一直进入error方法里,进入到请求的.ashx页面.这个问题,我未找到是什么原因.反正我使用了一下的代码,就好了. $ ...

  6. win8共享文件设置 详细教程

    1.开放防火墙445端口 2.进入组策略,依次进入 从网络访问计算机 属性里--添加-Guest 3.进入 然后把里面的用户清空 4.打开网络和共享中心,关闭密码保护共享

  7. 【Ubuntu】任务管理器loadruner

    linux1 准备工作   可以通过两种方法验证服务器上是否配置了rstatd守护程序:    ①使用rup命令,它用于报告计算机的各种统计信息,其中就包括rstatd的配置信息.使用命令rup 10 ...

  8. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  9. 微服务之springCloud-docker-feign-hystrix-ribbon(七)

    简介 在上一节中,我们讨论了feign+hystrix在项目开发中,除了考虑正常的调用之外,负载均衡和故障转移也是关注的重点,这也是feign + ribbon+hystrix的优势所在,本节我们就讨 ...

  10. Python urllib2 proxy

    在 正式并入某大公司之后,网络必须设置为统一的proxy,好的方面没看到,但是立即让我一的一个小工具不能工作了.在之前使用urllib2库,无需设置proxy,一切工作正常.在必须使用proxy之后, ...