首先看一下obj文件格式:

obj文件中可以有v(顶点位置)、vt(顶点纹理坐标)、vn(顶点法向量)、f(面)开头的四种类型数据。

所有的obj文件中都有v型数据。格式如下:

v 0.437500 0.164062 0.765625
v -0.437500 0.164062 0.765625
v 0.500000 0.093750 0.687500
  1. vt(顶点纹理坐标),格式如下:

    vt 0.651583 0.342268
    vt 0.652889 0.355515
    vt 0.641220 0.366408
    vt 0.628246 0.364052
    vt 0.654194 0.368763

    2. vn(顶点法向量坐标),格式如下:

    vn 0.837179 -0.311379 0.449639
    vn 0.878055 0.385575 0.283465
    vn 0.276184 0.130417 0.952215
    vn 0.287141 -0.526486 0.800227
    vn 0.255366 0.316928 0.913425

    3.f(面),格式如下:

    f 6203/4489/4130 1062/4483/4124 6215/4510/4151 3078/4513/4154
    f 5471/2749/2665 3078/4513/4154 6216/4514/4155 710/2752/2668
    f 3078/4513/4154 6215/4510/4151 1067/4512/4153 6216/4514/4155
    f 1006/3940/3718 6008/3937/3734 3079/4515/4156 6218/4516/4157
    f 6008/3937/3734 714/2761/2677 5476/2760/2676 3079/4515/4156

    现一一分析介绍:

1.v(顶点坐标位置):
 可以看到v后面有三个参数,分别代表该顶点的x、y、z三个坐标值。
2.vt(顶点纹理坐标):
 vt后面两个参数,分别代表纹理的U、V值。
3.vn(顶点法向量):
 vn后面三个参数,分别代表法向量的x、y、z值。
对于顶点法向量想说的是:我们向opengl中导入3D模型时,如果obj文件中没有vn,就需要我们手动计算面片的法向量,
否则显示出来的图形可能不正确。如果obj文件中有vn,那么,我们就一个点一个点进行绘制,不需要计算面的法向量。
vn表示的是顶点的法向量,不是面的法向量。
 举个例子:如果绘制的是四角面片(网上太多例子是三角面片了)
VN[0] = (vnSets[firstVertexIndexf])[0];//第一个点的法向量的x
VN[1] = (vnSets[firstVertexIndexf])[1];//第一个点的法向量的y
VN[2] = (vnSets[firstVertexIndexf])[2];//第一个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V1[0], V1[1], V1[2]);VN[0] = (vnSets[secondVertexIndexf])[0];//第二个点的法向量的x
VN[1] = (vnSets[secondVertexIndexf])[1];//第二个点的法向量的y
VN[2] = (vnSets[secondVertexIndexf])[2];//第二个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V2[0], V2[1], V2[2]);VN[0] = (vnSets[thirdVertexIndexf])[0];//第三个点的法向量的x
VN[1] = (vnSets[thirdVertexIndexf])[1];//第三个点的法向量的y
VN[2] = (vnSets[thirdVertexIndexf])[2];//第三个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V3[0], V3[1], V3[2]);VN[0] = (vnSets[fourthVertexIndexf])[0];//第四个点的法向量的x
VN[1] = (vnSets[fourthVertexIndexf])[1];//第四个点的法向量的y
VN[2] = (vnSets[fourthVertexIndexf])[2];//第四个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V4[0], V4[1], V4[2]);

这样就可以绘制出四边形了。

4.f(面):
面较为复杂,如果是简单的obj文件,面的格式可以为:

f 47 1 3
f 4 2 48
f 45 3 5
f 6 4 46

复杂的可以为:

f 3643/6900/6406 7305/6826/6332 1602/6797/6303 7332/6880/6386
f 1592/6749/6259 7343/6901/6407 3644/6902/6408 7269/6750/6260
f 7343/6901/6407 1631/6903/6409 7344/6904/6410 3644/6902/6408
f 7269/6750/6260 3644/6902/6408 7345/6905/6411 1595/6753/6263

面是由点构成的。一行有几个空格(n)区分,就有n+1个点。opengl允许绘制多边形,所以一行可以有多个点构成。

每个点又分为3项:顶点位置坐标索引、顶点纹理坐标索引、顶点法向量坐标索引。
注意:这里都是索引。为什么引入索引? --方便查找。
顶点位置坐标索引对应obj文件的v数据;
顶点纹理坐标索引对应obj文件的vt数据;
顶点法向量坐标索引对应obj文件的vn数据;
我们要根据索引一步一步找到obj文件中各个点对应的真实数据。这样才能进行绘制。

opengl关于obj文件相关知识相关推荐

  1. unity动态加载.obj文件相关

    .obj文件加载相关 QA: 要点 .obj文件结构 .mtl文件结构 材质匹配问题 动态加载obj文件 unity资源商城插件:Runtime Obj Importer QA: q: 如何动态加载o ...

  2. Qt|OpenGL对obj文件的认识以及如何去解析(opengl+qt构造地球模型)

    首先来个简单点的.obj文件(如下图所示): 总体处理伪代码如下: void GraphicsModel::init(const QString filePath) {QFile file(fileP ...

  3. [OpenGL]导入obj文件

    通常来说我们构建一个模型是比较复杂的工作,那么我们还有什么途径获得模型呢.其中一种方法就是导入obj模型,不要被这个名词给吓到了,其实就是把一个制作好的模型保存到一个文件中,我们称为obj文件. 先上 ...

  4. SQLServer数据库文件相关知识笔记

    1.数据库文件概念 数据库文件是SQLServer数据库的物理体现,和计算机的普通文件一样存储在计算机的磁盘空间当中.作为数据库记录和日志等其他信息的存储载体. 2.数据库文件分类 数据库文件主要包括 ...

  5. linux C语言 文件相关知识01

    ps:文件描述符表,与文件指针 有什么联系??? 1. linux 系统,一般一个进程 允许打开的最大文件数量是 1024, 对应内核区的进程控制块(pcb)中的文件描述符表的范围, 在shell输入 ...

  6. .podSpec文件相关知识整理

    文章目录 前言 一. .podspec文件的创建 二. .podspec文件的常用配置字段介绍 三方 .framework和.a Library pch xib和storyboard 资源设置 BIT ...

  7. C语言文件重点知识总结(冲冲冲)

    函数库查找链接:C 标准库 – 参考手册 | 菜鸟教程 文章目录 文件类型 C语言有关文件函数 文件缓冲区 总结 前言 文件是硬盘储存数据内容必不可少的一部分,所以文件相关知识我们应当有所认知并熟练使 ...

  8. 3D中obj文件操作

    3D中的OBJ文件格式详解:https://blog.csdn.net/shenshen211/article/details/51740988 三维模型obj文件的格式解析与读取 :https:// ...

  9. 【我的OpenGL学习进阶之旅】关于3D模型知识之:什么是obj文件和mtl文件

    文章目录 一.学习3D模型的背景 二.3D模型效果展示 三.好奇3D模型文件是啥内容? 3.1 打开.obj文件 3.2 打开.obj文件 3.3 在外部使用查看3D模型的软件打开.obj文件 3.3 ...

最新文章

  1. CSP 201912-1 报数 python实现
  2. poj 2352 Stars(线段树)
  3. 关于mtl_transactions_interface表序列
  4. linux字符cdev和Inode的关系
  5. 分布式环境下的session共享
  6. 基于单片机的自动追日系统设计_基于单片机的自动浇花系统的设计
  7. Linux服务部署之NTP时间服务器
  8. java c 客户端_java基于C/S模式实现聊天程序(客户端)
  9. 5G远程驾驶亮相进博会 网友:以后考个远程驾照?
  10. python创建虚拟环境打包_用虚拟环境保存库文件--Python打包-阿里云开发者社区
  11. 高分辨率:遥感卫星影像
  12. pip卸载安装的所有python包
  13. 门宝——门厂快速录单系统|木门录单软件
  14. 【数据挖掘概念与技术】学习笔记5-数据立方体技术
  15. 使用gb2312乱码,utf-8正常
  16. druid连接池监控
  17. Matlab中如何使函数作为参数传递
  18. 【算法•日更•第九期】树型动态规划详解:二叉苹果树
  19. 三方账号授权登录系统设计思路
  20. 【Python搞搞轻量Blog】第一发 Flask入门

热门文章

  1. Stack Overflow上最热门问题是什么?
  2. CSS代码检查工具stylelint
  3. 干货:计算机网络知识总结
  4. 我国大陆居民身份证Java验证
  5. 《淘宝店铺装修与促销设计宝典》一6.1 设计全面的店铺客服区
  6. 共享卫士完全设置教程图解
  7. ELK之ElasticSearch快速入门
  8. python3图形界面简单案例(tkinter)
  9. MongoDB的简单操作
  10. 系统进程间的同步机制