opengl读取obj模型3

这篇博客介绍了如何在OpenGL中读取包含法向量信息的obj模型,并处理mtl文件以应用材质。通过定义结构体存储材质信息,使用vector管理,同时修改loadObjModel函数以处理mtl文件。文章提到了CreateTexture函数的实现,并在objDraw函数中查找并设置材质信息。虽然示例效果图不佳,但代码逻辑没有问题。
摘要由CSDN通过智能技术生成

第三版本相较于前两个版本,添加了对 f 1//1 类型的支持(面 由点坐标和法向量组成),以及对mtl文件的读取。

准备工作,准备一个结构体来保存材质信息,然后由vector保存即可

struct mMaterial
{
	float Ns;     //shinness
	float Ka[3];
	float Kd[3];
	float Ks[3];
	string mTextureName;
	GLuint mTextureId;
};

ka,kd,ks即相应的环境光,漫反射及镜面反射的参数,mTextureName保存着该材质的名称,由mtl文件读入,mTextureId即纹理贴图。

objModel类新加入一个成员变量mtlName,用于存储材质名称,方便从vector中查询材质信息。


class objModel :public List
{
public:
	objModel() {}
	void loadObjModel(const char*);
	void print();
	void objDraw();
private:
	vector<Float3> normal, texcoord, position;     //vector容器存储法线,纹理坐标及点的位置信息
	vector<Face> face;
	int vertnum;
	int coordnum;
	int nornum;
	std::string mtlName;
};

修改loadObjModel函数,使其能够对mtl文件进行读写。定义一个全局变量来存储mtl信息,std::vector<mMaterial> mMtl;。

CreateTexture函数自己实现就好了。

void objModel::loadObjModel(const char* objFileName)
{
	int nFileSize = 0;
	unsigned char* fileContent = LoadFileContent(objFileName, nFileSize);    //读取文件内容
	if (fileContent == nullptr)     //文件为空
	{
		return;
	}
	objModel* tempModel = new objModel;
	stringstream ssFileContent((char*)fileContent);   //流读取文件内容
	string temp;       //接受无关信息
	char szoneLine[256];        //读取一行的数据
	while (!ssFileContent.eof())
	{
		memset(szoneLine, 0, 256);        //  每次循环初始化数组szoneLine
		ssFileContent.getline(szoneLine, 256);      //流读取一行

		if (strlen(szoneLine) > 0)       //该行不为空
		{
			if (szoneLine[0] == 'v')     //v开头的数据
			{
				stringstream ssOneLine(szoneLine);        //数据存储到流中 方便赋值
				if (szoneLine[1] == 't')       //纹理信息
				{
					ssOneLine >> temp;     //接受标识符 vt
					Float3 tempTexcoord;
					ssOneLine >> tempTexcoord.Data[0] >> tempTexcoord.Data[1];   //数据存入临时变量中
					tempModel->te
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值