在android上如何将obj文件导入至opengl

baacloud免费翻墙vpn注册使用

背景:

若想在Android上用opengl画出复杂的3d模型,能想到的直接的 办法就是从一个已经生成好的obj文件中导入。obj文件包含了3d模型的所有vertices的坐标(以v起始),所有vertices的normal 坐标(以vn起始),所有点的texture坐标(以vt起始),以及所有face的信息(以f起始)。用Opengl ES画出3d模型,只需要知道每个vertex的坐标、normal坐标和texture坐标即可。但是,obj文件中的vertices坐标和 texture坐标数量并不相等,也就是说,并不是每一个vertex都有一个对应的texture坐标,所以直接将v、vn和vt起始的坐标定义为数组 让opengl画是行不通的。
为什么obj文件中的vertices坐标和texture坐标的数量不相等呢?如下图所示,A点作为空间坐标,只需要被定义一次。但是A点属于6个三角形,每个三角形的texture可能都不相同,导致了A点可能拥有6种texture坐标。
解决方法:
1. 我在网上找到了一个perl程序。它可以分析obj文件内容,生成等数量的vertices、texture和normal数组,并存放在.h文件中。
perl程序下载地址:https://db.tt/YWPev7Wy
使用方法为:安装好perl运行环境。在命令行中运行:perl obj2opengl.pl your_obj_file.obj
输出:同文件夹下生成同名.h文件
来源:http://heikobehrens.net/2009/08/27/obj2opengl/
2. 打开生成的头文件,将里面的vertices、texture和normal数组分别存成3个文件。现在,只要在你的Renderer类中,定义3个 float数组,分别用来表示3d模型的vertices、texture和normal。这3个float数组的内容由存好的3个文件导入。
想知道在Android中通过导入文件定义大容量float数组的同学,请转:http://maider.blog.sohu.com/281585518.html
不会OpenGL ES on Android还在孜孜不倦地看这篇文章的同学,请转:http://www.learnopengles.com/android-lesson-one-getting-started/
参考:
http://iphonedevelopment.blogspot.com/2008/12/texture-coordinate-arrays-or-things.html
https://en.wikipedia.org/wiki/Wavefront_.obj_file
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏