程序环境
IDE:Visual Stdio 2019
语言:C++
OpenGL库:glut
不会安装glut环境的看我上一篇博客
什么是OBJ文件
obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。
OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。
使用Blender建模,得到一个猴头模型
导出为obj文件
得到一个obj文件,右键用打开方式选TXT
OBJ文件格式
上面导出时,我选择了三角面,所以在obj文件中f开头那一行数据只有三个数字,这三个是顶点索引。之所以这样做是为了下面方便写导入函数。
具体的格式:看这篇博客
实现思路
众所周知,不共线的3个点可以确定一个平面。在OpenGL中,绘制一个面需要3个顶点坐标,绘制方向是逆时针。
读取OBJ文件的数据
由于obj文件的行数十分多,光一个只包含顶点数据和顶点索引的猴头就有1500行,所以要采用c++的vector来储存数据。读取文件少不了要处理字符串,还好c++提供了十分友好的字符串处理函数fstream和sstream。
为了方便操作,我写成一个ObjLoader类。
#pragma once
#include <vector>
#include <iostream>
#include <gl/glut.h>
using namespace std;
class ObjLoader
{
public:
struct vertex
{
float x;
float y;
float z;
};
ObjLoader(string filename);//读取函数
void Draw();//绘制函数
private:
vector<vector<GLfloat>> v;//存放顶点(x,y,z)坐标
vector<vector<GLint>> f;//存放面的三个顶点索引
};
ObjLoader::ObjLoader(string filename)
{
ifstream file(filename);
string line;
while (getline(file, line))
{
if (line.substr(0, 1) == "v")
{
vector<GLfloat> Point;
GLfloat x, y, z;
istringstream s(line.substr(2));
s >> x; s