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#产品经理#

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部