要完成图形学课程的大作业,用传统的手动写点,线,面等其他数据的方式太繁琐,工程量太大,且效果不好。故而使用3dsmax建模,然后导出obj模型,读取模型进行绘制即可。
要读取obj模型,首先要知道obj模型的内容,即点,面,法线,纹理坐标等。
用记事本打开obj文件,即可查看obj的内容。
其中#为注释部分
先读取一个最简单的obj模型
v 就是点的位置信息(3f x,y,z)
vn 就是点的法线信息(3f x,y,z)
vt 是点的纹理坐标(3f u,v,w),一般只用uv坐标即可
f 即面的信息
面最基本的形式就是 f 1/1/1 2/2/2 3/3/3,其中每个分块就是一个点的信息(三角面片构成面,所以是三个分块),每个点的信息都由 顶点位置索引/纹理坐标索引/法线索引构成(索引从1开始,用c++读取的时候要注意 -1)。
面的信息有多种形式,这里只讨论这一种,其他形式各位自己去实现就ok
下面就是读取obj文件了,先进行准备工作
struct Float3 //点的位置信息和法线信息的数据类型
{
float Data[3]; //x,y,z
};
struct Float2 //点的纹理坐标数据类型
{
float Data[2]; //u,v
};
struct Face //面信息
{
int vertex[3][3]; //三个点构成一个面 每个点有三个索引信息
};
unsigned char*LoadFileContent(const char*path, int &filesize) //该函数来自于萌谷教程
//读取文件,返回文件内容,把文件大小赋值给filesize
{
unsigned char*fileContent = nullptr;
filesize = 0;
FILE*pFile = fopen(path, "rb"); //二进制方式读取
if (pFile)
{
fseek(pFile, 0, SEEK_END); //将文件指针移动到文件末尾
int nLen = ftell(pFil