3dmax用FBX格式把模型导出并导入unity时需要注意的问题。
目录
一、角度问题
1.问题研究
先创建一个Demo场景,能辨认出朝向的。
放入unity里面结果
模型对象角度是(0,0,0)的,子物体对象角度是(-90,0,0)的,不行。
需要注意的是,前面导出的高级设置轴转换,无论是Y向上还是Z向上结果是一样的。
------------------------------------------
加个顶级分组再导出
这种情况就变成模型对象(根对象)是(-90,0,0),子物体是(0,0,0)了。
多加几层分组也是一样的:
1.在没有顶级分组的情况下,导入Unity中,根物体的角度是(0,0,0),第一级子物体(或分组)的角度是(-90,0,0),后续子物体(或分组)的角度是(0,0,0)
2.在有顶级分组的情况下,根物体角度是(-90,0,0),下面的子物体角度都是(0,0,0)
2.解决方案操作
旋转轴:在3dmax中选中物体,切换到层次,仅影响轴。
在没有顶级分组情况下:
红色的轴是X轴,绿色的是Y轴,蓝色的是Z轴,默认是Z轴向上的。
进入旋转操作,注意要选中角度捕捉,设置90度。
旋转90°
注意,这时虽然看起来全选了,实际上选择就只有顶级的4个分组和物体,旋转的也是这4个的轴。导入Unity中,后上面的4个对于与第2级物体了,是(0,0,0)的,而第3级变成了(-90,0,0),4级则还是(0,0,0)了。
就算按ctr+a,或者全部框选,看起来像选中所有的物体,旋转所有物体的轴。
再导出FBX导入Unity,发现还是有些是(-90,0,0)。
正确操作是,先全选,然后选择按递归方式打开,然后再全选(这样才能选中全部物体),再旋转轴。
导出到Unity中后,所有的层级的物体都是(0,0,0)了。
---------------------------------------------------------------------------
在有顶级分组的情况下,假如旋转顶级分组本身的轴,导入Unity中则会是2级物体是(-90,0,0),其他都是(0,0,0)
正确操作还是和上面一样,要选择按递归方式打开,再旋转全部轴。
二、轴心位置问题
上面的问题也算是轴心的角度问题,这里讨论轴心位置问题。
1.1个物体
创建一个小球,坐标设置成(0,0,0)
导入unity中,结果,坐标也是(0,0,0)。
修改物体坐标,再次导入unity中,物体有个初始坐标了,拖出来到Hierarchy里面,会有个坐标在物体上,但是修改物体坐标为(0,0,0),模型能够显示在unity的原点位置,这种情况问题不大。
大部分模型拿来放到unity中也不是用它自己的初始化位置,而是会给他一个位置(无论手动添加到场景中还是代码设置)。
-------------------------------------
接下来要修改轴的位置了。
在上面的基础上,在unity中,创建一个子物体,坐标是(0,0,0),这个子物体的位置就和3dmax导入的模型重合在一起的。
3dmax中修改轴的位置,移动到物体外面。
导入uinty,能看到轴心在小球物体外面了,而且P5这个对象有坐标。
这个坐标到底是什么呢?
可以看到这个代表unity原点的点,在3dmax的小球的里面,小球的位置是在(0,0,0)没错的,但是P5这个对象的坐标则是(0,0,-6)的。
假如把P5的坐标设置为(0,0,0)的话,小球就不在(0,0,0)上了。
创建一个(0,0,0)相对坐标的子物体,
子物体会出现在轴心位置
结论:一个物体,在unity里面的坐标值指的是轴心的坐标。
注意,其实在unity里面点击物体看到的坐标轴不一定就是模型的轴心,这里是1个物体,情况简单。
多个物体时,Unity会自动算一个轴心显示的,一般是几个模型的中心,这个显示轴心不一定就是模型的轴心。而相对坐标(0,0,0)的子物体则一定就是轴心的位置。
2.2个物体
导入unity中
在unity中看到的和3dmax中一样的。
假如我把Sphere001的坐标从修改为(0,0,0),改成(0,10,0)。
导入unity中也是一样的
但是,这种情况其实是有问题的。
用小球看不出来,假如我创建一个大楼。
随便建,不用考虑大楼在世界坐标中的位置。
导入unity后
大楼就偏了。
为什么说偏了呢?因为轴心偏了。问题和前面一个物体是手动把轴心拖出来是一样的。
这里明明P6坐标是(0,0,0),大楼就是不在(0,0,0),不在下面正方形(假设是广场)的中心。
这个大楼不是整个世界,是一个大场景中的一部分,比如一个广场上的某一座大楼。Unity中的整个场景不会是全部用一个max文件创建的,会有多个max文件,多个人员,创建一个世界中的不同部分,然后合并组织成一个完整的场景的。
比如大楼原本计划在unity场景的(0,0,0)的,上面的导出模型的情况下,根本没有方便的操作去把大楼模型放到(0,0,0)的,因为它的轴心在模型的外面。
3dmax导出的模型的轴心必须在模型的中心,才能在场景组织时和其他模型能配合起来。
如何操作:3dmax中创建包含全部模型的顶层组,并把该组坐标设置为(0,0,0)。
unity中好使用了。
--------------------------------
这里其实还有的小问题,大楼跑到地下去了。
在3dmax中把组的轴心拖到地板中心
进入unity中,则模型P8,拖动出来就有个初始坐标了(0,-3.4,0)。
把坐标改成(0,0,0),则:
所以我们要求的模型轴心有两种:物体中心或者底面中心。
两种都可以,设备一般要求物体中心,大楼等建筑物体中心和地面中心都行,大楼等物体中心的情况下,代码上也是能统一处理的。
---------------------------------------------------------------------
其实这里就不是一定要把顶层组设置(0,0,0)了,和最前面的一个物体的情况一样。大不了有个初始坐标,使用是设置一下坐标就好了。
没有顶层组的情况下,3dmax导出的模型的轴心是原来3dmax中的世界坐标的(0,0,0)的位置。有顶层组的情况下,顶层组作为一个物体考虑,模型的轴心就是组的轴心,一般也就是组下面的模型的中心。
三、3dmax旋转缩放操作的影响
1.3dmax和unity的坐标单位
没有修改单位的情况下,默认m为单位。
放到Unity中,结果能够和Unity里面的(1,1,1)大小的Cube重合
把3dmax的单位改成mm,结果就是1000mm的立方体和Unity里面1个单位的立方体是重合的。
说明Unity里面的1个单位就是3dmax里面的1m。
2.旋转操作
导入unity
。。。。
3.缩放操作
四、结论
1.max文件导出前必须有一个顶层组,有且只有一个。
2.选择按递归方式打开,再旋转全部模型的轴的角度,旋转成Y轴(绿色)向上。
3.Unity里面的1个单位就是3dmax里面的1m
//todo:四、3dmax二次开发,下一篇博客吧