【Android论文栏目提醒】:本文主要为网学会员提供“三维Obj模型在android中的载人与渲染 - 期刊论文”,希望对需要三维Obj模型在android中的载人与渲染 - 期刊论文网友有所帮助,学习一下!
ISSN 1009-3044 E-mail: edufcccc.net.cnComputer 16 期 2012 年 6 月第 8 卷第Knowledge and Technology 电脑知识与技术 http://www.dnzs.net.cn Computer Knowledge and Technology 电脑知识与技术 Vol.8 No.16 June 2012. Tel:86-551-5690963 5690964三维 Obj 模型在
android 中的载人与渲染杨乾(厦门大学 自动化系 ,福建 厦门 361005)摘要:介绍了
android 平台对 OpenGL 的支持,流行的 obj 三维文件格式。
并论述了如何在
android 平台中对 obj 格式进行载人和渲染。
重点是介绍了如何用程序实现 obj 模型的载人和渲染。
关键词: 三维模型 opengl obj
android 3d中图分类号:TP18 A 文献标识码: 文章编号:1009-3044201216-3951-03Load and Render Three-dimensional Model of Obj in the AndroidYANG QianDepartment of Automation Xiamen University Xiamen 361005 ChinaAbstract:Introduce the support for OpenGL of the
Android platform and popular obj 3D file format.discusses how to load and render theobj model in the
android .the focus is how to load and render the obj model with the program.Key words:three-dimensional model opengl obj
android 3d OpenGL 是个专业的 3D 程序接口, 是一个功能强大, 调用方便的底层 3D 图形库。
OpenGL 的前身是 SGI 公司为其图形工作站开的 IRIS GL。
IRIS GL 是一个工业标准的 3D 图形软件接口, 功能虽然强大但是移植性不好, 于是 SGI 公司便在 IRIS GL 的基础上开发 OpenGL 。
Android 3D 引擎采用的是 OpenGL ES。
OpenGL ES 是一套为手持和嵌入式系统设计的 3D 引擎 API, Khronos 公司由维护。
在 PC 领域, 一直有两种标准的 3D API 进行竞争,OpenGL 和 DirectX。
一般主流的游戏和显卡都支持这两种渲染方式, DirectX 在 Windows 平台上有很大的优势, 但是 OpenGL 具有更好的跨平台性。
由于嵌入式系统和 PC 相比, 一般说来,CPU、 内存等都比PC 差很多,而且对能耗有着特殊的要求, 许多嵌入式设备并没有浮点运算协处理器, 针对嵌入式系统的以上特点, Khronos 对标准的OpenGL 系统进行了维护和改动, 以期望满足嵌入式设备对 3D 绘图的要求。
Android 系统使用 OpenGL 的标准接口来支持 3D 图形功能,
android 3D 图形系统也分为 java 框架和本地代码两部分。
本地代码主要实现的 OpenGL 接口的库, Java 框架层, 在 javax.microedition.khronos.opengles 是 java 标准的 OpenGL 包,
android.opengl 包提供了 OpenGL 系统和
Android GUI 系统之间的联系。
在真正的游戏中, 我们要绘制的 3D 物体往往十分复杂, 我们通常的做法都是在专门的建模工具中创建模型, 再将模型导出为特定的格式, 然后在我们的程序载入这个模型并进行渲染。
在计算机平台上, 常用的 3D 模型有 3DS、 OBJ、MD2、MD3、 MDL 等多种格式。
这里只介绍 OBJ 模型。
1 OBJ 模型文件格式 OBJ 文件格式是非常简单的。
这种文件以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。
OBJ 文件的每 都有极其相似的格式。
在 OBJ 文件中,一行, 每行的格式如下: 表 1 每行格式 前缀 参数 1 参数 2 参数 3 … 前缀标识了这一行所存储的信息类型。
参数则是具体的数据。
OBJ 文件的前缀可以有: 其中, 表 2 OBJ 文件中的前缀 前缀 说明 表示本行指定一个顶点。
v 此前缀后跟着 3 个单精度浮点数, Y、 分别表示该定点的 X、 Z 坐标值 表示本行指定一个纹理坐标。
vt V 此前缀后跟着两个单精度浮点数。
分别表示此纹理坐标的 U、 值收稿日期:2012-04-05 杨乾 , 江西瑞金人,作者简介: (1986-) 男, 主要研究方向为模式识别。
在读硕士, 本栏目责任编辑:唐一东 人工智能及识别技术 3951Computer Knowledge and Technology 电脑知识与技术 第 8 卷第 16 期 2012 年 6 月 表示本行指定一个法线向量。
vn 此前缀后跟着 3 个单精度浮点数, Y、 分别表示该法向量的 X、 Z 坐标值 表示本行指定一个表面Face。
f 一个表面实际上就是一个三角形图元。
此前缀行的参数格式后面将详细介绍。
此前缀后只跟着一个参数。
该参数指定了从此行之后到下一个以 usemtl 开头的行 usemtl 之间的所有表面所使用的材质名称。
该材质可以在此 OBJ 文件所附属的 MTL 文件 中找到具体信息。
此前缀后只跟着一个参数。
该参数指定了此 OBJ 文件所使用的材质库文件.mtl的 mtllib 文件路径2 用于存储材质信息的 MTL 文件格式 MTL 文件与 OBJ 文件极其相似。
只是用于标识行的前缀有所不同。
这些前缀的意义如表 3 所示。
表 3 MTL 文件中的前缀 前缀 说明 表示新建一个材质。
newmtl 此前缀后跟一个字符串,表示此材质的名称。
此行之后的信息都是对这个材质进行设定。
Ka 指定最后建立的材质的环境光成分。
此行包含 3 个单精度浮点参数。
Kd 指定最后建立的材质的漫射光成分。
此行包含 3 个单精度浮点参数。
Ks 指定最后建立的材质的镜面光成分。
此行包含 3 个单精度浮点参数。
-s”则此行将包括 5 个 指定最后建立的材质的反射贴图。
如果此行的第一个参数为字符串” , map_Kd 参数。
其中第二、 V、 第三和第四个参数为此纹理贴图在 U、 W 方向的缩放值,第五个参数为纹 -s”那么第一个参数就是此纹理图片的文件名。
理图片的文件名。
如果第一个字符串不是” , -s”则此行将包括 5 个 指定最后建立的材质的镜面贴图。
如果此行的第一个参数为字符串” , map_Ks 参数。
其中第二、 V、 第三和第四个参数为此纹理贴图在 U、 W 方向的缩放值,第五个参数为纹 -s”那么第一个参数就是此纹理图片的文件名。
理图片的文件名。
如果第一个字符串不是” , 由这些信息,我们就足以写一个类,用于读取和渲染 OBJ 模型了。
3 程序实现 一个大模型可能有多个小模型组合而成, 也可能已经定义了材质。
所以定义了一下三个类。
小模型 TDModelPart ,大模型 TDModel,材质 Material。
小模型 TDModelPart 类 public class TDModelPart public Material material null// 材质 public boolean hasMaterial false// 是否有材质 public int faceCount 0// 画面的顶点索引数 public int vnCount 0// 法线索引数 public int vtCount 0// 纹理索引数 public int vCount 0// 按顺序画面的顶点数 public FloatBuffer vnBuffer// 法线缓冲区 public ShortBuffer faceBuffer// 画面的顶点索引缓冲区,可以不用 public FloatBuffer vtBuffer// 纹理缓冲区 public FloatBuffer vBuffer// 按顺序画面的顶点坐标缓冲区 材质 Material 类 public class Material public String name// 材质名称 newmtl public float ambientColor // 环境反射系数 Ka public float diffuseColor// 漫反射系数 Kd public float specularColor// 镜面反射系数 Ks public float tf// 滤光透射率 Tf public float alpha// 渐隐指数 Trd public float shine// 反射指数 Ns public float refraction// 折射值 Ni 3952 人工智能及识别技术 本栏目责任编辑:唐一东第 8 卷第 16 期 2012 年 6 月 Computer Knowledge and Technology 电脑知识与技术 public int illum// 光照模型 illum public String textureFileKa// 环境反射指定纹理文件 map_Ka public String textureFileKd// 漫反射指定纹理文件 map_Kd public String textureFileKs// 镜面反射指定纹理文件 map_Ks 大模型 TDModel 类 public class TDModel Vector parts//小模型数组 public float left 0//模型最左边 public float right 0//模型最右边 public float front 0//模型最前边 public float back 0//模型最后边 public float bottom 0//模型最上边 public float top 0//模型最下边 public void drawGL10 gl //定义模型渲染的方法 同时定义了两个辅助类对 obj 和 mtl 文件进行加载。
Obj 文件加载类 public class OBJParser // 返回读取的模型, yz 模型坐标为 opengl 左手坐标, 轴根据 3dmax 翻转 public TDModel parseOBJString fileName mtl 文件加载类 public class MTLParser // 返回材质库 public static Vector loadMTLContext context String file 这些加载和渲染方法定义好之后就剩下
android 平台的实现了。
Android 的界面显示需要定义 Activity,界面中需要 View 来显示3d 模型。
Android 专门定义了 GLSurfaceView 建立了与 opengl 之间的联系。
所以定义类 OBJToDATASurfaceView 继承 GLSurfaceView 实现 Renderer 接口。
就可以绘制出 obj 模型了。
一下是一个 obj 模型在
android 上各个侧面的渲染截图。
图 1 前面视图 图 2 后面视图 图 3 右侧面视图 图 4 左侧面视图 图 5 上面视图 图 6 下面视图 (下转第3976页) 本栏目责任编辑:唐一东 人工智能及识别技术 3953Computer Knowledge and Technology 电脑知识与技术 第 8 卷第 16 期 2012 年 6 月 通过模拟实验, 3, 5 我们得到了图 2, 4, 的结果。
我们可以清楚地发现, 改进的 PSO 算法的表现性能优于标准 PSO 算法。
仔细观察各表, 我们也可以发现 2 者在迭代次数为 100 到 1000 次之间时,性能有不小的提升(如图 2) 而超过 1000 次以后, , 性能基本保持不变,在少数情况下, 反而会有所下降 (如图 5)。
改进 PSO 算法为什么对 Griewank 函数的效果会随着迭代次数的增加而下降的原因, 我们现在还不得而知。
一个可能的原因是函数的边界以及实验的设定。
我们在以后会更加深入探讨这个问题。
然而, 从上面得到的实验结果, 可以看出改进的 PSO 算法明显优于标准 PSO 算法。
4 结束语 该文提出了一种基于周边信息的 PSO 改进算法, 通过与标准 PSO 算法进行多次实验比较与性能分析。
通过实验结果,我们可以得出改进的 PSO 算法的表现优于标准 PSO 算法的结论。
为了对算法有更进一步的研究, 我们在以后还需要对更多地优化函数进行分析测试,另外改进 PSO 算法的边界选取策略和迭代次数还需要更进一步的研究。
在我们将来的研究中, 我们会进行更多的实验来理解 PSO 算法的行为与表现。
参考文献:1 Shi Y HEberhart R C.A modified particle swarm optimizationC.Proceedings of IEEE International Conference on Evolutionary Computa tion1998:69-73.2 RAHMATIZADEH S HSHAH-HOSSEINI HTORKAMAN H.The Ant-Bee routing algorithm: a new agent based Nature-Inspired rout ing algorithmJ.Journal of Applied science200995:983-987.3 LI XIANGLIANG XIMINGYAN GANGetc.Using co-line search technique to improve performance of PSOJ.Control ConferenceCCC 200827th Chinese2008:49-52.4 SOUDANSAAD.An evolutionary dynamic population size PSO implementationC.Information and Communication Technologies:From Theory to Applications 2008 3rd International Conference2008:1-5.5 JIE JINGZENG JIANCHAO.Particle swarm optimization with diversity controlled acceleration coefficientsC. Natural Computation 2007 3rd International Conference 2007:150-154.6 PARSOPOULOS K EVARAHATIS M N.Parameter selection and adaptation in unified particle swarm optimizationJ.Journal on Mathe matical and Computer Modeling200746:198-213.7 Li T S.Applying wavelets transform and support vector machine for copper clad laminate defects classificationJ.Computers Industrial Engineering200956:1154-1168.8 Vapnik V N.An overview of statistical learning theoryJ.IEEE Transaction on Neural Networks1999105:988-999.(上接第3953页)4 小结 Obj 模型文件的载人和渲染已经完成, 程序渲染效果比较理想,材质也渲染出来了,程序还实现了模型贴图的渲染。
如果要实现
android 游戏的开发,除了模型外, 物理引擎等很多复杂的东西, 还要有动画实现, 但是模型载人是这些游戏的基础。
参考文献:1 刘甫迎.
Android 移动编程实用教程M.北京:电子工业出版社2012.2 吴亚峰苏亚光.
Android 游戏开发大全M.北京:人民邮电出版社2012.3 郝玉龙.
Android 程序设计基础M.北京:清华大学出版社2012.4 安吉尔.交互式计算机图形学M.5 版.北京:电子工业出版社2009.5 吕希奎周小平.实战 OpenGL 三维可视化系统开发与源码精解M.北京:电子工业出版社2009.6 希尔.计算机图形学M.3 版.北京:清华大学出版社2007.7 徐明亮卢红星王琬.OpenGL 游戏编程M.北京:机械工业出版社2008. 3976 人工智能及识别技术 本栏目责任编辑:唐一东