keil obj 文件 结构_OBJ模型文件的结构、导入与渲染Ⅱ

23beb6f69d3f23215871d8e65df233e2.png

继续上篇的内容,根据OBJ文件格式载入模型,并利用OpenGL的Indexed VBO技术进行渲染。本文所在的载入类ZWModelOBJ,如果阁下发现有什么BUG或者有什么好的建议,请多指教。作者地址是——http://www.ZwqXin.com

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
原文地址:http://www.zwqxin.com/archives/opengl/obj-model-format-import-and-render-2.html

2. OBJ,从读入到渲染

对一个模型来说,初始化的时候调用导入函数进行“读入”,渲染时调用渲染函数进行渲染,这是最基本的步骤了:

  1. //导入模型
  2. bool ImportModel(wchar_t *strFileName);
  3. //渲染模型
  4. void RenderModel();

其中,导入函数读入obj文件,然后开始存取数据:

  1. //ImportModel函数part1
  2. bool ZWModelOBJ::ImportModel(wchar_t *strFileName, GLuint usage)
  3. {
  4. ..............
  5. // 打开文件
  6. _wfopen_s(&m_FilePointer, szPathFileName, L"rb");
  7. ...............
  8. // 读入文件信息
  9. ProcessFileInfo(&m_ModelOBJ); //m_ModelOBJ即我们的模型对象t3DModel
  10. m_ModelOBJ.bIsTextured = true;
  11. // 关闭打开的文件
  12. fclose(m_FilePointer);
  13. ....................

在上篇[OBJ模型文件的结构、导入与渲染Ⅰ]末尾放出的对象数据的导入结构体如下:

  1. // 对象信息结构体
  2. typedef struct tag3DObject
  3. {
  4. int nMaterialID; // 纹理ID
  5. bool bHasTexture; // 是否具有纹理映射
  6. bool bHasNormal; // 是否具有法线
  7. std::vector<Vector3> PosVerts; // 对象的顶点
  8. std::vector<Vector3> Normals; // 对象的法向量
  9. std::vector<TexCoord> Texcoords; // 纹理UV坐标
  10. std::vector<unsigned short> Indexes; // 对象的顶点索引
  11. unsigned int nNumIndexes; // 索引数目
  12. GLuint nPosVBO;
  13. GLuint nNormVBO;
  14. GLuint nTexcoordVBO;
  15. GLuint nIndexVBO;
  16. }t3DObject;

很明显地,对于模型里面的每一个网格对象,分别用三个vector保存它的顶点属性:位置、法线、纹理坐标(注意,如之前所述,只有位置属性是必须的),用一个vector来储存顶点索引,另加一个unsigned int来储存索引总数,另用四个unsigned int来保存vertex-VBO、normal-VBO、texcoord-VBO、Index-VBO对象。这里产生了一串问题:

  1. 怎么划分这些网格对象(t3DObject)?——在obj文件里用组(g)来划分对象(另外,有时在顶点数据区头部也有一个g,不产生对象,应忽略),这固然是合情合理。但是,想想为什么我们要划分对象,而不是整个模型一次过地放入一个结构体里呢?3DS的话那是按chunk来的没什么问题,可是OBJ呢?忽略组(g)信息,把一个个面按顺序导入效果有什么不一样吗?没有——如果你没有材质信息的话。是的,导入模型之所以要区分对象(object)&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值