最近写图形学作业,需要读取obj文件并进行解析,所以学习了一下obj文件的格式,参考了一些博客,侵删。

Obj(或者.obj)是一种几何定义文件格式,文件格式是公开的,并能很好的在其他的3D应用中被支持。Obj文件格式是一种简单的单独表示3D几何图元的文件格式——也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标、以及纹理UV坐标序列。面的顶点默认为逆时针顺序,法向量不是必须的。OBJ文件并非归一化的,但是可以在注释中加入缩放信息。
Obj文件可以是ASCII的编码(.obj)方式也可以是二进制格式(.mod)。以ASCII格式存储的obj文件必须用.obj作为文件拓展名。

1. 文件格式(File Format)

以哈希字符(#)开始的一行表示注释。

一个obj格式的文件可能包含了顶点数据,自由形式的曲面/表面属性,绘制索引序列,自由形式的曲面/表面内容声明,关联自由形式的表面,组和渲染属性信息。大多数常见的绘制索引表现为几何顶点,纹理坐标,顶点法线以及多边形的面:

1.1 几何顶点

一个顶点可以用字符v开头的一行来表示。接着后面跟上(x, y, z [w])的值来表示顶点坐标。W是可选项,默认为1.0。一些应用支持顶点颜色,通过在x y z后面跟上red, green, blue值来表示。颜色值的范围为0到1.0。

1.2 参数顶点空间

自由形式的几何图元声明可以使用字符vp开头的行来表示,用于定义一个曲面或者平面的参数空间中的顶点。"u"只能在曲面顶点中使用,u和v用于表示non-rational剪裁曲面的点,而u,v以及w表示rational剪裁曲面的点。

1.3 表面单元

表面通过一个包含顶点,纹理以及法线索引的序列来表示。类似四边形这种多边形可以通过多于三个包含顶点/纹理/法线索引来定义。
OBJ文件也支持自由形式的使用曲面和表现来定义对象的几何图元,例如NURBS表面。

顶点索引

一个合法的顶点索引符合上面定义的顶点序列格式。如果一个索引是正值则表示相对于顶点序列从1开始的偏移。如果一个索引是负的,表示从顶点序列结尾的偏移,从-1开始。
每个面都可以包含三个或者更多的顶点。

f v1 v2 v3 ....

纹理坐标索引

在描述一个平面的时候,纹理坐标索引作为可选项用于描述该顶点相关的纹理坐标。为了描述纹理坐标索引,必须在顶点坐标索引之后紧密添加一根斜线(/),之后再紧密添加纹理坐标索引。在斜线的前后都不能有空格。一个合法的纹理坐标索引从1开始,并符合之前描述的格式。每个面可以包含三个或者更多的单元。

f v1/vt1 v2/vt2 v3/vt3 ...

顶点法线索引

法线索引用于描述顶点的法向量,在描述面的时候是可选项。要添加顶点法线索引,必须在纹理索引之后添加第二根斜线(/),然后在之后添加法线索引。斜线前后不能有空格。合法的法线索引从1开始,并符合之前面描述的格式。每个面可以包含三个或者更多的单元。

f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...

顶点坐标法线索引(不包含纹理索引)

可以在定义几何图元的时候忽略纹理坐标索引,但是必须在顶点坐标索引后加上两根斜线(//),然后添加法线索引。

f v1//vn1 v2//vn2 v3//vn3 ...

其他几何格式

Obj文件采用若干差值方法来支持高阶表面,例如泰勒和B差值,尽管支持这些特性要使用一些非标准的第三方文件。Obj文件不支持网格分级或者任何其他形式的动画或形变,例如顶点蒙皮或纹理变形。

材质引用

描述多边形的可见属性存储在外部的.mtl文件中。OBJ文件可能会引用超过一个的.mtl文件。.mtl文件可能包含一个或者多个不同命名的材质定义。

mtllib [external .mtl file name]...

通过绘制单元之后的这个标签来指明使用的材质。材质名称必须和外部定义的.mtl文件名称匹配。

usemtl [material name]...

objects名称和多边形group标签

o [object name]...g [group name]...
  • Group声明用于组织模型的单元(element)以及简化数据操作
  • Object声明用于标识在一个文件中的不同object单元
    所有的group声明都是基于状态的。依旧是一旦声明了group,将应用于所有之后的内容,直到下一个group 声明。
    通过Smoothing Group可以实现多边形平滑渲染。

单个obj文件中可以包含多个object标签或group标签。
其中,o标签和g标签仅仅是在组织上进行分组而存在的,例如一个o标签下,可能包含多个g,或者一个g开头的顶点数据集合之后包含多个g组织描述的三角面。也有将usemtl标签作为网格分组的,原因是考虑了同一组网格使用了相同的纹理。但有个不方面的地方就是对于需要单个控制的地方,略显不便。例如一个o或者g标签的数据集合表示人脸,之后眼睛,耳朵,鼻子等五官分作不同的g来组织,使用同一个纹理。采用usemtl分组的话,如果想对眼睛,嘴巴,等进行单独变换的时候很不方便。因此,本人还是采用g来进行网格划分。
通常处理obj文件的时候,会抛弃顶点法线数据,而通过顶点信息来进行计算。有了以上的顶点坐标、法线、纹理坐标等信息,就可以进行3D模型文件的渲染了。


参考来源:https://www.jianshu.com/p/f7f3e7b6ebf5

obj文件格式学习(自用)相关推荐

  1. .obj文件格式与.mtl文件格式(转)

    最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少.今天把最近搜索的资料整合了一下.

这里的obj文件格式指的是Wavefront公司为它的一套基于工作 ...

  2. obj文件格式与mtl文件格式

    .obj文件格式与.mtl文件格式 最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少.今天把最近搜索的资料整合了一下. 这里的obj文件格式指的是Wav ...

  3. 详解3D中obj文件格式

    原文链接:https://www.jianshu.com/p/f7f3e7b6ebf5 加载3D模型的时候,遇到.obj格式的模型文件.之前有专门看过相关的资料,可惜没有总结,一下就忘了.再次用到,又 ...

  4. Wavefront OBJ文件格式

    Wavefront OBJ文件格式 文章同时发布于:https://pengfeixc.com/blog/60e66901e97367196dce3f05 一.一个四边形 下面是一个简单的四边形的.o ...

  5. 3D中的 obj文件格式

    http://www.cnblogs.com/kex1n/archive/2011/09/23/2186351.html 接下来要介绍的模型文件格式是OBJ格式.该格式非常流行,而且可以使用大量3D建 ...

  6. 图形学基础 | 详解3D中的obj文件格式

    详解3D中的obj文件格式 Obj文件格式是一种简单的单独表示3D几何图元的文件格式--也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标.以及纹理UV坐标序列. 面 ...

  7. 3D中的OBJ文件格式详解(转载)

    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...

  8. 3D中OBJ文件格式详解

    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...

  9. 3D中的OBJ文件格式详解(转)

    常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...

  10. Linux里gcc编译过程分析和ELF文件格式学习

    GCC编译器背后的故事及常用命令.了解ELF文件格式 前言 一.GCC简介 二.GCC背后的战友 1.Binutils 2.C运行库 三.GCC编译流程及对应命令 1.编译流程图及命令框图 2.实践操 ...

最新文章

  1. 查看目标网站--结构
  2. 【机器学习】数据挖掘算法——关联规则(一),相关概念,评价指标
  3. 求职学习笔记|并发编程知识点常见问题总结(一)
  4. python nums函数获取结果记录集有多少行记录_PHP mysqli_num_rows():获取查询结果的行数...
  5. Js树形插件ztree
  6. 网游中的网络编程系列1:UDP vs. TCP
  7. 安捷伦温度测试仪 软件,安捷伦34970A数据采集器温度测试仪是德科技34970A+34901A模块...
  8. SpringBoot 深入浅出
  9. R语言中dim函数_R语言入门:函数介绍(3)—— %gt;%
  10. Linux如何用link命令停网卡,如何使用 ethtool 命令管理以太网卡 | Linux 中国
  11. 【vue】【开源】vue开源电商项目hello-mall嗨喽商城
  12. 流形-Manifold
  13. Ardupilot环境搭建
  14. bilibili注册页面编码HTML码,哔哩哔哩bilibili新人邀请码在哪填写 B站怎么绑定输入邀请码方法...
  15. Python分析《哈哈哈哈哈》第11期弹幕数据
  16. 爬取豆瓣读书-豆瓣成员常用的标签(Python爬虫实战)
  17. BACKUP DATABASE
  18. 19年暑假实习,我霸面了鹅厂两次。
  19. linux Kconfig语法
  20. js动态添加元素为何 点击事件无效

热门文章

  1. 【优秀课设】基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)
  2. 一个网页设计需求方眼中的网页设计
  3. 即时通讯html页面模板,网页html即时通讯的快速实现方法 - 快商通
  4. 纯html+css制作banner轮播图
  5. 在线制作banner
  6. mysql 留存率_用mysql统计留存率
  7. 汇编语言-实验5(学习打卡Day10)
  8. 物联网下的智慧停车 让智能化找到车位
  9. Unable to partial resync with the slave for lack of backlog (Slave request was: 2595405802583).
  10. ubuntu里解决Firefox登陆12306问题