介绍:

在最近的3D编程中,开始做一些多模型的Demo,而网上显然没有那么多直接可供DirectX使用的模型文件(.x),而3D模型文件格式中的obj文件则具有较好的通用性,不仅支持各类3D建模软件的互相导入导出,在Maya上还可以直接读写。

OBJ文件结构:

以一个立方体模型的obj文件为例:

# 一些注释mtllib cube.mtl
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
vt 0.998008 0.998008
vt 0.001992 0.998008
vt 0.998008 0.001992
vt 0.001992 0.001992
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s 1
g pCube1
usemtl file1SG
f 1/1/1 2/2/2 3/3/3
f 3/3/3 2/2/2 4/4/4
s 2
f 3/13/5 4/14/6 5/15/7
f 5/15/7 4/14/6 6/16/8
s 3
f 5/21/9 6/22/10 7/23/11
f 7/23/11 6/22/10 8/24/12
s 4
f 7/17/13 8/18/14 1/19/15
f 1/19/15 8/18/14 2/20/16
s 5
f 2/5/17 8/6/18 4/7/19
f 4/7/19 8/6/18 6/8/20
s 6
f 7/9/21 1/10/22 5/11/23
f 5/11/23 1/10/22 3/12/24

不得不说,obj文件结构上非常简单,

v开头的行暗示是顶点数据,

v+' '的行表示是顶点数据之空间坐标(position),

v+'t'的行表示是顶点数据之纹理坐标(texture coordinate),

v+‘n’的行表示是顶点数据之法线向量(normal)。

上述文件为一个立方体,总共有8个顶点(v+' '开头的行正好是8行),而对于纹理坐标和法线,相同的顶点在不同三角面片上是不同的,在立方体中,一个顶点为三个面共有,所以纹理坐标和法线的描述应该有8*3=24行(v+'t',v+'n'开头的行正好各是24行)。

各个顶点的数据都有了,我们还需要索引数据。

对于我们通常写的3D程序来说,一个索引值对应于一个顶点,这个顶点有固定的空间坐标,纹理坐标,法线。

而对于obj文件,一个索引值对应于一个顶点数据的空间坐标,或者纹理坐标,法线,且由1开始计数。

比如说,对于上述的立方体obj文件,

v+' '的行从v+' '开始的第一行直到结束的第八行分别对应于索引1-8,

v+'t'的行从v+'t'开始的第一行直到结束的第二十四行分别对应于索引1-24,

v+'n'的行从v+'n'开始的第一行直到结束的第二十四行分别对应于索引1-24。

然后我们就像自助餐一样去自由组合“v+' '索引/v+'t'索引/v+'n'”索引,来得到需要的顶点。

再接着往下看,f开头的行,正如你所想,表示面(face),以3个“v+' '索引/v+'t'索引/v+'n'索引”描述的顶点组成。

对于其他信息,基本上都可以选择忽略,注意#开头的是注释。

知道了obj文件格式,就可以自由地转换到需要的格式了,比如下面这种非常简单的自定义格式:

Vertex Count: 36
 
Data:
 
-0.5 0.5 -0.5 0.001992 0.00199199 0 0 -1
0.5 -0.5 -0.5 0.998008 0.998008 0 0 -1
-0.5 -0.5 -0.5 0.001992 0.998008 0 0 -1
0.5 0.5 -0.5 0.998008 0.00199199 0 0 -1
0.5 -0.5 -0.5 0.998008 0.998008 0 0 -1
-0.5 0.5 -0.5 0.001992 0.00199199 0 0 -1
-0.5 0.5 0.5 0.001992 0.00199199 0 1 -0
0.5 0.5 -0.5 0.998008 0.998008 0 1 -0
-0.5 0.5 -0.5 0.001992 0.998008 0 1 -0
0.5 0.5 0.5 0.998008 0.00199199 0 1 -0
0.5 0.5 -0.5 0.998008 0.998008 0 1 -0
-0.5 0.5 0.5 0.001992 0.00199199 0 1 -0
-0.5 -0.5 0.5 0.998008 0.998008 0 0 1
0.5 0.5 0.5 0.001992 0.00199199 0 0 1
-0.5 0.5 0.5 0.998008 0.00199199 0 0 1
0.5 -0.5 0.5 0.001992 0.998008 0 0 1
0.5 0.5 0.5 0.001992 0.00199199 0 0 1
-0.5 -0.5 0.5 0.998008 0.998008 0 0 1
-0.5 -0.5 -0.5 0.001992 0.00199199 0 -1 -0
0.5 -0.5 0.5 0.998008 0.998008 0 -1 -0
-0.5 -0.5 0.5 0.001992 0.998008 0 -1 -0
0.5 -0.5 -0.5 0.998008 0.00199199 0 -1 -0
0.5 -0.5 0.5 0.998008 0.998008 0 -1 -0
-0.5 -0.5 -0.5 0.001992 0.00199199 0 -1 -0
0.5 0.5 -0.5 0.001992 0.00199199 1 0 -0
0.5 -0.5 0.5 0.998008 0.998008 1 0 -0
0.5 -0.5 -0.5 0.001992 0.998008 1 0 -0
0.5 0.5 0.5 0.998008 0.00199199 1 0 -0
0.5 -0.5 0.5 0.998008 0.998008 1 0 -0
0.5 0.5 -0.5 0.001992 0.00199199 1 0 -0
-0.5 0.5 0.5 0.001992 0.00199199 -1 0 -0
-0.5 -0.5 -0.5 0.998008 0.998008 -1 0 -0
-0.5 -0.5 0.5 0.001992 0.998008 -1 0 -0
-0.5 0.5 -0.5 0.998008 0.00199199 -1 0 -0
-0.5 -0.5 -0.5 0.998008 0.998008 -1 0 -0
-0.5 0.5 0.5 0.001992 0.00199199 -1 0 -0

提供顶点个数,然后Data下的每三行描述一个三角面片,没有使用索引。

每行从左到右是position(x,y,z),texcoord(u,v), normal(nx, ny, nz)。

为什么要自定义模型格式?这是因为各种建模软件的模型格式种类太多,而你可以对需要用的格式定制解析到你自定义的格式的Parser。由于都转为自定义格式供DirectX调用,在移植给OpenGL,Vulcan使用时也省了.x文件再转.xx文件的苦恼。

如何将obj文件转换到上述自定义格式见下面链接提供的ObjParser源代码。

最后感谢RasterTek提供的教程。

链接:http://pan.baidu.com/s/1pLpjUjT

// csdn传了经常被删= =,试试网盘。。

// github:https://github.com/DrinkMoon/directx11-pratices/tree/master/Engine/ObjParser

// = =个人练习directx11的repo而已。。欢迎吐槽。。

使用方式:

错误提示见parse-error-log.txt( 一些IO成功失败的信息,成功解析obj以后,也可在此文件中看到Successed in parsing mayaCube.obj这样的提示 )

示意图:

转自:https://blog.csdn.net/tjj00686/article/details/52745344

OBJ(3D模型)文件格式相关推荐

  1. 超图桌面版加载obj 3D模型

    根据目前看到的资料帮助,使用超图桌面版加载obj 3D模型的步骤如下: 新建场景,图层管理器---普通图层右键,新建KML----开启KML可编辑,右键添加模型. 下面来操作一下: 下一个obj模型: ...

  2. 超图桌面版加载obj 3D模型 - 2

    在 https://blog.csdn.net/bcbobo21cn/article/details/109041525 里,加载obj格式模型没有出来效果: 下面来看一下其他方法:当前用的版本是10 ...

  3. 3D模型文件--STL,OBJ,3DS

    STL格式 全称是Stereolithographic,是3DSystem公司提出的3D模型文件格式,它采用三角形离散地近似表示三维模型,目前已被工业界认为是快速成形领域的标准描述文件格式. STL文 ...

  4. 【Unity】模型文件格式、常见3D模型格式

    文章目录 模型文件格式 支持的模型文件格式 标准文件格式 专有文件格式 不支持的模型文件格式 从3ds Max 导入对象 从 Maya 导入对象 限制 常见的3D软件格式 .fbx 格式 .obj 格 ...

  5. 模型文件格式:off stl obj

    1.物体文件格式(.off)文件 用于表示给定了表面多边形的模型的几何体.这里的多边形可以有任意数量的顶点. 普林斯顿形状Banchmark中的.off文件遵循以下标准.  OFF文件全是以OFF关键 ...

  6. 3d展示网页开发_超实用:一篇文章带你了解市面上主流通用的3D模型格式

    说到格式,相信大家都不陌生. 随着互联网的普及,我们几乎每天都会和不同的格式打交道,文本的TXT.图片的JPG.视频的MP4,就连压缩包也有不同的格式. 通俗来说,你可以把"格式" ...

  7. 【3D】常见的3D模型格式介绍

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

  8. 3D模型格式的一点总结

    通俗来说,你可以把"格式"理解成基于同一规范的技术表征,也可以再简化点把它看成一种分类方式.对于3D模型来说,格式更是种类繁多.不同应用领域的.不同功能属性的,加密的.独有的.通用 ...

  9. .obj 和 .mtl文件格式

    obj文件是3D模型文件格式.由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发的一种标准,适合用于3D软件模型之间的互导,也可 ...

  10. 3D模型汇总----骨骼模型

    3D模型的格式有很多,每个公司或软件都可以自己定义自己的格式,或公开或不公开.如max,obj, x(微软),fbx(被Autodesk收购),dae,md2(Quake2),ms3d(MilkSha ...

最新文章

  1. 1.75亿美元!吴恩达第三锤:宣布成立AI基金AIFund
  2. hihoCoder 第136周 优化延迟(二分答案+手写堆)
  3. c语言的锁和Python锁,Python中全局解释器锁、多线程和多进程
  4. 工作74:vue带参数跳转其他页面
  5. QT中信号和槽的简单解释
  6. activiti7流程设计器_基于容器和微服务应用的架构:容器设计原则
  7. js中substr与substring的差别
  8. addroutes没添加进去_CAD中如何绘制函数曲线及添加数学公式
  9. 汇编语言学习之汇编语言源程序的输入
  10. strcpy_s函数
  11. 关于STC-ISP软件程序烧录失败率高的解决办法
  12. eclipse配置jboss
  13. mysql怎么读取数据,面试建议
  14. MSE(L2损失)与MAE(L1损失)的分析
  15. “宽客鼻祖”的诞生——爱德华·索普
  16. C语言float是什么类型,float是什么数据类型?
  17. 2021年起重机司机(限桥式起重机)考试题及起重机司机(限桥式起重机)考试试卷
  18. 自学成才的黑客(安全研究员)是从哪学到那些知识的?(跳转知乎)
  19. 【思路】2021marthorcup高校数学建模挑战赛思路/资料/mathorcup思路/2021mathorcup建模思路
  20. 企业内部培训和外部培训的区分

热门文章

  1. ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
  2. 使用shell命令行查询wifi信号强度
  3. Matlab 地理(经纬度)坐标 转 笛卡尔(直角)坐标
  4. 苹果airplay是什么 苹果手机投屏到电脑
  5. 苹果手机怎么无线投屏?苹果手机无线投屏到电脑
  6. C++课程设计--人民币大小写转换器(MFC)
  7. ppp协议c语言,ppp协议是用于拨号上网和路由器之间通信的点到点通信协议,是属于(1)协议,它不具有(2)的功能。( - 信管网...
  8. html5添加上下居中,详解HTML5中垂直上下居中的解决方案
  9. 微信小程序获取用户信息(附代码、流程图)
  10. Python3爬虫与多线程