obj文件格式学习(自用)
最近写图形学作业,需要读取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文件格式学习(自用)相关推荐
- .obj文件格式与.mtl文件格式(转)
最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少.今天把最近搜索的资料整合了一下. 这里的obj文件格式指的是Wavefront公司为它的一套基于工作 ...
- obj文件格式与mtl文件格式
.obj文件格式与.mtl文件格式 最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少.今天把最近搜索的资料整合了一下. 这里的obj文件格式指的是Wav ...
- 详解3D中obj文件格式
原文链接:https://www.jianshu.com/p/f7f3e7b6ebf5 加载3D模型的时候,遇到.obj格式的模型文件.之前有专门看过相关的资料,可惜没有总结,一下就忘了.再次用到,又 ...
- Wavefront OBJ文件格式
Wavefront OBJ文件格式 文章同时发布于:https://pengfeixc.com/blog/60e66901e97367196dce3f05 一.一个四边形 下面是一个简单的四边形的.o ...
- 3D中的 obj文件格式
http://www.cnblogs.com/kex1n/archive/2011/09/23/2186351.html 接下来要介绍的模型文件格式是OBJ格式.该格式非常流行,而且可以使用大量3D建 ...
- 图形学基础 | 详解3D中的obj文件格式
详解3D中的obj文件格式 Obj文件格式是一种简单的单独表示3D几何图元的文件格式--也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标.以及纹理UV坐标序列. 面 ...
- 3D中的OBJ文件格式详解(转载)
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...
- 3D中OBJ文件格式详解
常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...
- 3D中的OBJ文件格式详解(转)
常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序:第二种是Alias|Wavefron ...
- Linux里gcc编译过程分析和ELF文件格式学习
GCC编译器背后的故事及常用命令.了解ELF文件格式 前言 一.GCC简介 二.GCC背后的战友 1.Binutils 2.C运行库 三.GCC编译流程及对应命令 1.编译流程图及命令框图 2.实践操 ...
最新文章
- 查看目标网站--结构
- 【机器学习】数据挖掘算法——关联规则(一),相关概念,评价指标
- 求职学习笔记|并发编程知识点常见问题总结(一)
- python nums函数获取结果记录集有多少行记录_PHP mysqli_num_rows():获取查询结果的行数...
- Js树形插件ztree
- 网游中的网络编程系列1:UDP vs. TCP
- 安捷伦温度测试仪 软件,安捷伦34970A数据采集器温度测试仪是德科技34970A+34901A模块...
- SpringBoot 深入浅出
- R语言中dim函数_R语言入门:函数介绍(3)—— %gt;%
- Linux如何用link命令停网卡,如何使用 ethtool 命令管理以太网卡 | Linux 中国
- 【vue】【开源】vue开源电商项目hello-mall嗨喽商城
- 流形-Manifold
- Ardupilot环境搭建
- bilibili注册页面编码HTML码,哔哩哔哩bilibili新人邀请码在哪填写 B站怎么绑定输入邀请码方法...
- Python分析《哈哈哈哈哈》第11期弹幕数据
- 爬取豆瓣读书-豆瓣成员常用的标签(Python爬虫实战)
- BACKUP DATABASE
- 19年暑假实习,我霸面了鹅厂两次。
- linux Kconfig语法
- js动态添加元素为何 点击事件无效
热门文章
- 【优秀课设】基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)
- 一个网页设计需求方眼中的网页设计
- 即时通讯html页面模板,网页html即时通讯的快速实现方法 - 快商通
- 纯html+css制作banner轮播图
- 在线制作banner
- mysql 留存率_用mysql统计留存率
- 汇编语言-实验5(学习打卡Day10)
- 物联网下的智慧停车 让智能化找到车位
- Unable to partial resync with the slave for lack of backlog (Slave request was: 2595405802583).
- ubuntu里解决Firefox登陆12306问题