OpenGL glut导入OBJ模型文件

程序环境

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++提供了十分友好的字符串处理函数fstreamsstream
为了方便操作,我写成一个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 
  • 11
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值