【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用


引言

在3D模型开发和3D引擎加载过程中,OBJ格式是最基础、最常见的标准之一。即便在今天流行的GLTF、USDZ格式出现后,OBJ依然是建模软件和渲染引擎普遍支持的基本格式。

本文以Blender导出的立方体模型为例,详细讲解OBJ与MTL文件每一部分的含义与使用规范,帮助读者深入理解obj文件底层结构,为后续游戏开发、3D渲染打下扎实基础。


OBJ 文件结构详解

来看一段真实的Blender导出的立方体.obj文件内容:

完整内容:

plaintext 复制代码
# Blender 4.2.0
# www.blender.org
mtllib 无标题.mtl
o 立方体
v -1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
s 0
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/8/4 6/7/4 2/9/4 1/10/4
f 3/11/5 7/6/5 5/8/5 1/12/5
f 8/5/6 4/13/6 2/14/6 6/7/6

简单梳理:

plaintext 复制代码
# Blender 4.2.0
# www.blender.org
mtllib 无标题.mtl
o 立方体
v -1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
...
vn -1.0000 -0.0000 -0.0000
...
vt 0.375000 0.000000
...
s 0
f 1/1/1 2/2/1 4/3/1 3/4/1
...

逐行讲解:

1. 注释

plaintext 复制代码
# Blender 4.2.0
# www.blender.org
  • #表示注释,通常记录导出软件信息。

2. 材质引用

plaintext 复制代码
mtllib 无标题.mtl
  • mtllib声明使用的材质文件(MTL文件)。
  • 本例中引用了"无标题.mtl"。

3. 对象定义

plaintext 复制代码
o 立方体
  • o声明一个新的对象,名字叫"立方体"。

4. 顶点定义(Vertex)

plaintext 复制代码
v -1.000000 -1.000000 1.000000
  • v后面三个浮点数,依次是x、y、z坐标。

共有8个顶点,组成一个单位边长为2的立方体。

5. 顶点法线(Normal)

plaintext 复制代码
vn -1.0000 -0.0000 -0.0000
  • vn后面三个浮点数,表示法线向量。

总共有6个法线方向,分别对应立方体的6个面朝向。

6. 纹理坐标(UV)

plaintext 复制代码
vt 0.375000 0.000000
  • vt后面两个浮点数,是纹理坐标u,v。

用于在面上正确地映射贴图。

7. 平滑组(Smoothing Group)

plaintext 复制代码
s 0
  • s后跟编号。
  • 0表示关闭平滑,不进行顶点法线插值,每个面是硬边。

8. 面定义(Face)

plaintext 复制代码
f 1/1/1 2/2/1 4/3/1 3/4/1
  • f后跟一组顶点定义。
  • 每个小节是 v/vt/vn,即:
    • 顶点索引
    • 纹理坐标索引
    • 法线索引

例如1/1/1意味着:

  • 使用第1个顶点
  • 使用第1个纹理坐标
  • 使用第1个法线方向

本模型的每个面是四边形(quad)。


MTL 文件结构详解

来看对应的无标题.mtl内容:

plaintext 复制代码
# Blender 4.2.0
# www.blender.org

newmtl Material
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Kd 无标题_BaseColor.png

解释:

项目 含义
newmtl Material 创建新材质,名字叫Material
Ns 96.078431 高光反射指数(影响镜面高光大小)
Ka 环境光反射颜色
Kd 漫反射颜色(主要可见颜色)
Ks 镜面高光反射颜色
Ke 自发光颜色(自身发光,不受光照影响)
Ni 折射率(透明材质使用)
d 不透明度(d=1.0表示完全不透明)
illum 2 光照模型编号(2为有高光的漫反射模型)
map_Kd 指定漫反射颜色贴图文件

OBJ、MTL与贴图关系梳理

总体结构如下:

plaintext 复制代码
ModelFolder/
├── model.obj          # 几何信息,引用 material.mtl
├── material.mtl       # 材质信息,引用 texture.png
├── texture.png        # 实际纹理贴图
  • OBJ引用MTL。
  • MTL引用贴图。
  • 贴图文件通常是JPG或PNG格式。

小结与经验分享

  1. OBJ文件非常易读,适合手动编辑或调试。
  2. MTL文件补充材质定义,但不一定所有引擎都会完全支持MTL(比如有些引擎忽略高光参数)。
  3. 纹理坐标和法线是可选项,简单模型可以省略,但实际开发中一般都会包含。
  4. 保持文件相对路径正确,特别是批量导出模型时,注意OBJ、MTL、贴图位置一致。

附录:常见OBJ/MTL补充字段

OBJ命令 说明
g group_name 定义组(Group)
usemtl material_name 面开始使用指定材质
l v1 v2 v3 定义线段(用于线框模型)
MTL命令 说明
map_Bump 指定凹凸贴图
map_d 指定透明度贴图
map_Ks 指定高光颜色贴图
bump 另一个凹凸贴图的写法

结语

通过这篇文章,我们详细了解了OBJ文件与MTL文件的基本格式、各项参数含义以及它们之间的引用关系。

掌握这一基础,不仅可以手动编辑3D模型,还能更好地理解各种3D引擎(如Unity、Three.js)背后的模型加载机制。

在未来的项目开发中,不妨动手导出几个不同复杂度的OBJ模型,仔细观察并修改它们,相信你对3D开发的理解会越来越深入!


相关推荐
美狐美颜sdk3 小时前
直播美颜SDK动态贴纸模块开发指南:从人脸关键点识别到3D贴合
3d·美颜sdk·直播美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
cpsvps3 小时前
3D芯片香港集成:技术突破与产业机遇全景分析
人工智能·3d
8 小时前
3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
算法·3d·unity·c#·游戏引擎·sat
dzj202113 小时前
Unity是如何把3D场景显示到屏幕上的——Unity的渲染过程
3d·unity·游戏引擎·渲染·图形学
小赖同学啊1 天前
GIS地理信息系统建设:高精度3D建模
3d
计算机sci论文精选1 天前
CVPR 2024 3D传感框架实现无监督场景理解新纪元
人工智能·机器学习·计算机视觉·3d·cvpr·传感技术
程序员编程指南1 天前
Qt OpenGL 集成:开发 3D 图形应用
c语言·数据库·c++·qt·3d
GISBox1 天前
GISBox实操指南:如何将IFC文件高效转换为3DTiles格式‌‌
3d·免费工具
Listennnn1 天前
3D Semantic Occupancy Prediction
3d
三月的一天1 天前
react+threejs实现自适应分屏查看/3D场景对比功能/双场景对比查看器
3d·分屏控制·react threejs·多场景渲染