孙其功陪你学之——OJB文件介绍
例如:
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文件介绍相关推荐
- c语言读取.ppm文件,孙其功陪你学之——C语言读取.ppm文件
C语言读取.ppm图像文件,读取的是每一个像素点的R.G.B的之0--255之间 在写读取程序时遇到好多问题,比如类型转换问题最是头疼,数据量特别大,开始读出的数据 可能有好大一部分为0,导致误认为读 ...
- 孙其功陪你学之——Spark MLlib之协同过滤
转自 程序员的自我修养 – SelfUp.cn 由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享.1,220次浏览 什么是协同过滤 协同过滤(Collaborative Fi ...
- python 复制dict_Python高级数据类型之字典、集合【明哥陪你学Python-六】
上一篇我们简单对Python的基础数据类型做了说明和讲[Python高级数据类型之列表.元组],本篇我们继续针对Python的数据类型进行高级数据类型的介绍. 我们来先看一张图表: 字典(dict) ...
- 视频教程-小吴老师陪你学游戏角色动画-3Dmax
小吴老师陪你学游戏角色动画 擅长三维动画虚拟仿真从事教育信息化8年 王哲 ¥59.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ...
- 《手把手陪您学Python》26——自定义函数
在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...
- 《手把手陪您学Python》50——数组的dtype属性
在上一篇<手把手陪您学Python>49--数组的shape属性中,我们对数组的"形状"及其表示方式有了更为深入的了解. 今天,我们将会继续学习数组的属性,但不是与数组 ...
- 《手把手陪您学Python》42——类的魔法方法
在上一篇<手把手陪您学Python>41--类方法与实例方法中,我们引入了类方法的概念,并介绍了类方法与实例方法在语法规则和引用方面的差异.今天,我们将会继续介绍实例方法的应用,并介绍一种 ...
- 陪丈母娘学编程——JAVA之继承篇
陪丈母娘学编程--JAVA之继承篇 概述继承 总结 写在前面:最近阿姨迷上了和我学JAVA,也同时迷上了张亮的"继承",为了和小丽在一起,我一定要留住阿姨,争取让她早日出师,我也早 ...
- 在日常生活中,经常会遇到某些需求对文件名称进行修改,借助刚学过的文件操作,编写一个可以批量修改文件名的小程序。
在日常生活中,经常会遇到某些需求对文件名称进行修改,借助刚学过的文件操作,编写一个可以批量修改文件名的小程序. import os path=input('请输入文件路径(结尾加上/):') #获取该 ...
最新文章
- 产品经理和程序员的爱恨情仇
- 网站建设特定操作流程了解一下不吃亏
- 从零开始学python网络爬虫-从零开始学Python 三(网络爬虫)
- Mongodb基础实践(二)
- Django—模板渲染
- 走过小公司的坑之入职一周
- 看到他我一下子就悟了---委托
- 验证码——ImageIO.write的坑
- 天书夜读:从汇编语言到Windows内核编程笔记(3)
- 虚拟机如何做服务器系统,sap虚拟机作为服务器(sap系统虚拟机)
- excel查看编码格式_Excel表格中格式转换的这些套路,你都get了吗?
- 今天是元旦节,可是我失恋了
- 诡异大阳飙升动因何在
- SQLSERVER月份简写转数字
- 2.10 lnmp架构_慢查询 MySQL路由器 MHA高可用
- 【测试Demo】JavaAPI操作阿里云对象存储(OSS)
- 第一章-问题求解策略-LA4234-Binary Clock
- 帝国cms灵动标签调用标题图片没有图片时让其显示默认图片的方法
- 献给准大三的童鞋们,想要在暑假里找个java实习工作.
- Unity开发手游常用适配分辨率