OpenGLES 进阶教程 ( 一)-obj 文件和 mtl 文件解析
上周一个朋友问我,如果有一个.obj文件,如何用OpenGL ES把它显示到iOS屏幕上。
obj文件如下
之前学习blender的时候,在国外的一个系列教程有提到解析obj文件,这篇教程便来介绍如何 解析obj和mtl文件 ,并用OpenGL ES显示出来。
概念介绍
1、obj文件
obj文件是一种3D模型文件。
文件格式
其中
v 几何体顶点 (Geometric vertices)
vt 贴图坐标点 (Texture vertices)
vn 顶点法线 (Vertex normals)
f 面 (Face)
2、mtl文件
mtl文件则是obj文件的附属文件,描述几何体的表面属性。
文件格式
其中
环境反射 Ka r g b
漫反射 Kd r g b
镜反射 Ks r g b
反射指数 Ns exponent 指定材质的反射指数,定义了反射高光度
折射值 Ni ptical density 指定材质表面的光密度,即折射值
渐隐指数 d factor 参数factor表示物体融入背景的数量
核心思路
新建一个工程,读入obj和mtl文件,解析文件内容,写入到.h/.c文件中,把.h/.c文件加入新的工程引用。
效果展示
model.gif
具体细节
1、文件解析
自定义Model结构体来存储读取的信息,通过一行行读入文件,并用字符串匹配来解析数据。
typedef struct Model{ int vertices; int positions; int texels; int normals; int faces; int materials;}Model;Model getOBJinfo(string fp){ Model model = {0}; ifstream inOBJ; inOBJ.open(fp); if (!inOBJ.good()) { cout << "error on open " << fp << endl; exit(1); } while (!inOBJ.eof()) { string line; getline(inOBJ, line); string type = line.substr(0, 2); if (type.compare("v ") == 0) { model.positions++; } else if (type.compare("vt") == 0) { model.texels++; } else if (type.compare("vn") == 0) { model.normals++; } else if (type.compare("f ") == 0) { model.faces++; } } model.vertices = model.faces * 3; inOBJ.close(); return model;}
2、文件写入
把Model中存储的解析信息,分别写入到.h/.c文件中。
void writeCtexels(string fp, string name, Model model, int faces[][10], float texels[][2]){ // Append C file ofstream outC; outC.open(fp, ios::app); // Texels outC << "const float " << name << "Texels[" << model.vertices*2 << "] = " << endl; outC << "{" << endl; // Texels for(int j=0; j 文/落影loyinglin#产品经理#
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!