在做一个软光栅化渲染器.
增加对复杂模型的支持.
选择对OBJ文件进行支持.
OBJ文件格式介绍
文件格式的介绍可以参考前一篇文章
图形学基础 | 详解3D中的obj文件格式
OBJ文件载入
这里找了一个开源的OBJ文件解析的库 tinyobjloader.
只有一个头文件 tiny_obj_loader.h
主要的使用方法可以参考Github上的 loader_example.cc
Demo.
1. tiny_obj_loader.h
的使用
include这个头文件需要先定义一个宏
#define TINYOBJLOADER_IMPLEMENTATION
#include "tiny_obj_loader.h"
2. tiny_obj_loader.h
中数据结构的介绍
2.1 attrib_t
// Vertex attributes
typedef struct {
std::vector<real_t> vertices; // 'v'
std::vector<real_t> normals; // 'vn'
std::vector<real_t> texcoords; // 'vt'
std::vector<real_t> colors; // extension: vertex colors
} attrib_t;
attrib_t 主要存放的就是 OBJ文件中所有的顶点数据信息. 比如:
- vertices : 顶点位置信息
- normals : 法线信息
- texcoords : 纹理坐标信息
- colors : 颜色信息
2.2 shape_t
typedef struct {
std::string name;
mesh_t mesh;
path_t path;
} shape_t;
shape_t 表示的是比如这个物体的一个部分.
在 OBJ文件中, 如 o xxx
表示一个部分的开始.主要存储的信息有:
- name : 这部分的名称 xxx
- mesh : 构成这个部分的顶点信息. 这里通过使用索引的方式来记录 . 因为所有的数据信息都放在了
attrib_t
中. - path :
pairs of indices for lines
按注释的意思是 线段的索引. 可能有问题. 因为没有用到这个.
在这里重点在于 mesh_t 这个数据结构:
// Index struct to support different indices for vtx/normal/texcoord.
// -1 means no