QA:
q: 如何动态加载obj模型到unity?
a: 解析.obj模型文件字节流,文件里包含顶点信息网格信息材质信息等。
q: 加载后为裸模,如何匹配材质?
a: .obj文件里有mtllib 行数据,记录对应材质库文件(.mtl)所在 对材质库文件进行解析,材质库文件包含材质基本信息以及纹理所在路径
q: 模型只能应用一个材质,如何在一个模型上使用多个材质?
a: 在解析.obj模型文件时,存在usemtl 行数据,对应模型哪部分信息使用此材质
要点
unity 2019.4.30拖入obj文件时,如果模型含有多个submesh,unity会合并成一个,所以如果一个模型有多个submesh且使用不同材质,则会有材质问题。(其他版本不知道)
所以在动态加载obj文件时,要自己对submesh进行划分记录且记录对应的材质 自己绑定材质渲染submesh
.obj文件结构
- 没有文件头
- 由一行一行文本组成
- 以#开头注释
- 空格和空行可以随意添加
- 数据行由 [关键字 数据]组成
基础数据:(其他数据自己查)
关键字 | 解释 | 例子 | 作用 |
---|---|---|---|
v | 顶点 | v -57.2008 260.8698 -10.5155 | |
vt | 顶点贴图坐标 | vt -293.5261 -193.5156 -22.2743 | |
vn | 顶点法线 | vn 0.3007 -0.5771 0.7593 | |
f | 面构成点 | f 55612/21698/32579 55613/21699/32580 55617/21703/32584 55616/21702/32583 | |
o | 对象 | ||
g | 组 | g 对象001 | |
mtllib | 材质库 | mtllib qianbi_3g.mtl | 模型相关联的材质数据文件(.mtl文件) |
usemtl | 其后数据使用的材质 | usemtl model | 对此标签后的模型数据划分,可以在动态生成纹理时,让不同子网格匹配不同纹理,不至于一个纹理对应所有网格的错误 |
.mtl文件结构
newmtl shengzi//材质 名称
Ns 30.0000
Ni 1.5000
d 1.0000
Tr 0.0000
Tf 1.0000 1.0000 1.0000
illum 2
Ka 0.5880 0.5880 0.5880//环境反射rgb值
Kd 0.5880 0.5880 0.5880//漫反射rgb值
Ks 0.3960 0.3960 0.3960//高光(镜面)反射rgb值
Ke 0.0000 0.0000 0.0000
map_Ka UV.png//环境反射纹理
map_Kd UV.png//漫反射纹理
map_bump -bm 0.3000 UVaotu.png//法线贴图
bump -bm 0.3000 UVaotu.png
材质匹配问题
在解析.mtl文件的数据到unity中时,一些材质数据并不完全适用于unity的材质;
最简单的unity材质匹配就是:.mtl文件里的漫反射颜色+漫反射纹理 对应unity的标准材质的颜色和纹理贴图 .mtl中的rgb颜色值可能是在模型软件中加上光等其他颜色后所调的值,所以在unity中可能看起来效果不同
解决材质效果不同的思路:
1.自己写材质来对应 计算.mtl文件里的相关数据,看看哪些数据对表现效果有影响,然后再进行匹配
2.照着数据匹配,然后自己手动在unity中调试。
动态加载obj文件
unity资源商城插件:Runtime Obj Importer
思路:
Reader工具类辅助读取文件流
读取obj文件流中每行首个字符串 进行类别判断
读到mtllib 在同级文件下找mtl文件 解析文件里的材质信息