OBJ文件:

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。
OBJ文件不需要任何种头文件(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。注意连接符(\)后面不能出现空格或Tab格,否则将导致文件出错。
下关键字可以在OBJ文件使用。在这个列表中, 关键字根据数据类型排列,每个关键字有一段简短描述。
顶点数据(Vertex data):
v 几何体顶点(Geometric vertices)
vt 贴图坐标点(Texture vertices)
vn 顶点法线(Vertex normals)
vp 参数空格顶点 (Parameter space vertices)
自由形态曲线(Free-form curve)/表面属性(surface attributes):
deg 度(Degree)
bmat 基础矩阵(Basis matrix)
step 步尺寸(Step size)
cstype 曲线或表面类型 (Curve or surface type)
元素(Elements):
p 点(Point)
l 线(Line)
f 面(Face)
curv 曲线(Curve)
curv2 2D曲线(2D curve)
surf 表面(Surface)
自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):
parm 参数值(Parameter values )
trim 外部修剪循环(Outer trimming loop)
hole 内部整修循环(Inner trimming loop)
scrv 特殊曲线(Special curve)
sp 特殊的点(Special point)
end 结束陈述(End statement)
自由形态表面之间的连接(Connectivity between free-form surfaces):
con 连接 (Connect)
成组(Grouping):
g 组名称(Group name)
s 光滑组(Smoothing group)
mg 合并组(Merging group)
o 对象名称(Object name)
显示(Display)/渲染属性(render attributes):
bevel 导角插值(Bevel interpolation)
c_interp 颜色插值(Color interpolation)
d_interp 溶解插值(Dissolve interpolation)
lod 细节层次(Level of detail)
usemtl 材质名称(Material name)
mtllib 材质库(Material library)
shadow_obj 投射阴影(Shadow casting)
trace_obj 光线跟踪(Ray tracing)
ctech 曲线近似技术(Curve approximation technique)
stech 表面近似技术 (Surface approximation technique)
OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。

例如:

mtllib teapot.mtl
usemtl gold
v -3.000000 1.800000 0.000000
v -2.991600 1.800000 -0.081000
v -2.991600 1.800000 0.081000
v -2.989450 1.666162 0.000000
v -2.985000 1.921950 0.000000
v -2.985000 1.921950 0.000000
v -2.981175 1.667844 -0.081000
v -2.981175 1.667844 0.081000
v -2.976687 1.920243 -0.081000
v -2.976687 1.920243 0.081000
v -2.968800 1.800000 -0.144000
v -2.968800 1.800000 0.144000
v -2.958713 1.672406 -0.144000

1。OBJ文件

OBJ文件中包含丰富的3D对象类型,而且文档 的说明很详细。因此熟悉OBJ文件的格式对于理解其他3D文件的格式也是很有用的。
下面我们举例说明OBJ文件的格式:
例1:

v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
f 1 2 3 4

v 表示顶点坐标(vertex)。

f 表示面(face),就是多边形。最后一行表示一个
有四个顶点的多边形。其顶点是用引用号(reference
number)表示的。引用号就是顶点序号。

例二:

v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
f 1 2 3 4
f 8 7 6 5
f 4 3 7 8
f 5 1 4 8
f 5 6 2 1
f 2 6 7 3

这次有8个顶点,6个面。注意OBJ文件格式规范中规定可以用负的顶引用号表示相对顶点序号,但glm不能处理这
种情况,用3D Exploration可以打开,但objview会crash)。

例3:

v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
v 4.000000 0.000000 -1.255298
v 4.000000 2.000000 -1.255298
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.276597 0.000000 0.960986
vn 0.276597 0.000000 0.960986
vn 0.531611 0.000000 0.846988
vn 0.531611 0.000000 0.846988
# 6 vertices
# 6 normals
g all
s 1
f 1//1 2//2 3//3 4//4
f 4//4 3//3 5//5 6//6
# 2 elements

# 表示注释

vn 表示顶点法向矢量(vertex normal)。我们知道在OpenGL中要使用光照需要对每个点指定 法向矢量。在OBJ文件中则把这些法向矢量集中放在一起,而用序号来引用它们。
g 表示group,all是group的名字。下面的两个 face 都属于这个group,直到下一个g 命令或者 文件结束为止。
s 表示平滑组(smooth group),1是group的序号。
比较有意思的是最后两行。1//1 中第一个1表 示顶点序号(对应于由 v 命令定义的各行),后一个1表示顶点法向矢量序号(对应于由 vn命令
定义的各行)。中间其实省略了纹理矢量序号(对应于由 vt 命令定义的各行)。2//2,3//3,4//4,都作同样的解释。因此这一行还是表示一个四边形,只不过对每个点不仅定义了顶点坐标,而且定义了法向矢量。

例4:下面是colorcube.obj的内容:

mtllib colorcube.mtl
v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
# 8 vertices
g front
usemtl red
f 1 2 3 4
g back
usemtl blue
f 8 7 6 5
g right
usemtl green
f 4 3 7 8
g top
usemtl gold
f 5 1 4 8
g left
usemtl orange
f 5 6 2 1
g bottom
usemtl purple
f 2 6 7 3
# 6 elements

mtllib colorcube.obj 表示本OBJ文件要用到一个材料文件colorcube.mtl,这个文件和本文件在同一个目录下。
usemtl red 表示此后的物体使用名叫red的材料,直到下一个usemtl 命令为止。材料red 由colorcube.mtl 定义。
下面是colorcube.mtl的内容:

#
# colocube.mtl
#

newmtl red
Ka 0 0 0
Kd 1 0 0

newmtl blue
Ka 0 0 0
Kd 0 0 1

newmtl green
Ka 0 0 0
Kd 0 1 0

newmtl gold
Ka 0.247250 0.199500 0.074500
Kd 0.751640 0.606480 0.226480
Ks 0.628281 0.555802 0.366065
illum 0
Ns 51.200001

newmtl orange
Ka 0 0 0
Kd 0.9 0.5 0

newmtl purple
Ka 0 0 0
Kd 0.7 0 0.9

newmtl red 定义一个名叫red的材料。

Ka,Kd,Ks,illum,Ns 分别定义ambient, diffuse, specular, emission 和 shiness 参数。
到这里,我们对OBJ文件中涉及多边形的部分有了初步的了解。OBJ文件还包含很多其它的命令,实现规范中的所有命令是很繁杂的工作,glm.c 只实现了涉及多边形的一部命令,大体上也就是我们这几个例子中所用到的命令。

孙其功陪你学之——OJB文件介绍相关推荐

  1. c语言读取.ppm文件,孙其功陪你学之——C语言读取.ppm文件

    C语言读取.ppm图像文件,读取的是每一个像素点的R.G.B的之0--255之间 在写读取程序时遇到好多问题,比如类型转换问题最是头疼,数据量特别大,开始读出的数据 可能有好大一部分为0,导致误认为读 ...

  2. 孙其功陪你学之——Spark MLlib之协同过滤

    转自 程序员的自我修养 – SelfUp.cn 由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享.1,220次浏览 什么是协同过滤 协同过滤(Collaborative Fi ...

  3. python 复制dict_Python高级数据类型之字典、集合【明哥陪你学Python-六】

    上一篇我们简单对Python的基础数据类型做了说明和讲[Python高级数据类型之列表.元组],本篇我们继续针对Python的数据类型进行高级数据类型的介绍. 我们来先看一张图表: 字典(dict) ...

  4. 视频教程-小吴老师陪你学游戏角色动画-3Dmax

    小吴老师陪你学游戏角色动画 擅长三维动画虚拟仿真从事教育信息化8年 王哲 ¥59.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ...

  5. 《手把手陪您学Python》26——自定义函数

    在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...

  6. 《手把手陪您学Python》50——数组的dtype属性

    在上一篇<手把手陪您学Python>49--数组的shape属性中,我们对数组的"形状"及其表示方式有了更为深入的了解. 今天,我们将会继续学习数组的属性,但不是与数组 ...

  7. 《手把手陪您学Python》42——类的魔法方法

    在上一篇<手把手陪您学Python>41--类方法与实例方法中,我们引入了类方法的概念,并介绍了类方法与实例方法在语法规则和引用方面的差异.今天,我们将会继续介绍实例方法的应用,并介绍一种 ...

  8. 陪丈母娘学编程——JAVA之继承篇

    陪丈母娘学编程--JAVA之继承篇 概述继承 总结 写在前面:最近阿姨迷上了和我学JAVA,也同时迷上了张亮的"继承",为了和小丽在一起,我一定要留住阿姨,争取让她早日出师,我也早 ...

  9. 在日常生活中,经常会遇到某些需求对文件名称进行修改,借助刚学过的文件操作,编写一个可以批量修改文件名的小程序。

    在日常生活中,经常会遇到某些需求对文件名称进行修改,借助刚学过的文件操作,编写一个可以批量修改文件名的小程序. import os path=input('请输入文件路径(结尾加上/):') #获取该 ...

最新文章

  1. 产品经理和程序员的爱恨情仇
  2. 网站建设特定操作流程了解一下不吃亏
  3. 从零开始学python网络爬虫-从零开始学Python 三(网络爬虫)
  4. Mongodb基础实践(二)
  5. Django—模板渲染
  6. 走过小公司的坑之入职一周
  7. 看到他我一下子就悟了---委托
  8. 验证码——ImageIO.write的坑
  9. 天书夜读:从汇编语言到Windows内核编程笔记(3)
  10. 虚拟机如何做服务器系统,sap虚拟机作为服务器(sap系统虚拟机)
  11. excel查看编码格式_Excel表格中格式转换的这些套路,你都get了吗?
  12. 今天是元旦节,可是我失恋了
  13. 诡异大阳飙升动因何在
  14. SQLSERVER月份简写转数字
  15. 2.10 lnmp架构_慢查询 MySQL路由器 MHA高可用
  16. 【测试Demo】JavaAPI操作阿里云对象存储(OSS)
  17. 第一章-问题求解策略-LA4234-Binary Clock
  18. 帝国cms灵动标签调用标题图片没有图片时让其显示默认图片的方法
  19. 献给准大三的童鞋们,想要在暑假里找个java实习工作.
  20. Unity开发手游常用适配分辨率

热门文章

  1. 书评:他们思考,我们流汗--《华尔街的肉》
  2. nyoj-荷兰国旗问题
  3. 本地web服务器配置(IIS)
  4. AB32VG1项目之智能晾衣架
  5. druid.io中文版文档
  6. Win10激活提示“连接到internet激活windows”的最佳解决方法
  7. 预训练模型与传统方法在排序上有啥不同?
  8. 学计算机平面设计需不需要写生,计算机平面设计专业《素描》课程考试大纲
  9. 为你的项目搭建sentry并且通过企微推送
  10. C# 微信网页协议 代码记录