这个坑是关于 Blender 模型导出到 Unity 的。这个坑发现的比较早,但真正填好还是经过了一段时间的挣扎的。
坑描述
多年前的一天我在 Unity 下用代码实现 child object 旋转的时候发现 child object 不按照我的代码写的转。
以 Blender 里的 Suzanne 为例,默认 Blender 里添加猴头以后是面朝 -y。先绕 z 轴旋转180°,让他脸朝 +y ,然后按下 ctrl + A -> apply all transform,然后导出按 file -> export fbx,所有设置都为默认值然后导出。
然后将导出的 fbx 文件导入到 Unity。问题就出来了。
图中可以看到,首先猴头面朝方向变成了-z ,其次在 Transform 里 Rotation 下的 x 值显示的是 -89.98 约等于 -90。
当时查了一些资料,知道Blender导出的模型导入 Unity 就是这样的。于是就用了个笨办法,建了个 empty object,然后把子物体放在empty object 下。这样只要旋转 empty object 就可以达到正确旋转child object的效果了。
后来游戏场景大了,内容多了,发现每次都要搞 empty object,很麻烦。需要从根本上解决这个问题,也就是说所有的模型从 Blender 导出到 Unity 时就得是正确的 rotation。
原因分析
在解决问题之前,我们得先明白为什么会产生这种结果。
原因其实也很简单, Blender 和 Unity 用得坐标系不同。
Unity用的是左手坐标系。
Blender用的是右手坐标系。
不明白左右手坐标系的小伙伴可以点这里查看 In Three Dimension 那一节的内容。
右手坐标系里得模型是怎么也转不到跟左手一样得坐标上得。
由于我只用 Blender 和 3DCoat 作为我得主要建模软件,不清楚其他 3D 软件是不是也会碰到一样得问题,如有知道得小伙伴可以在评论里给我回复。相信用我下面得方法应该也是可以解决类似得问题。
填坑
下面就到了解决问题得时候了。
方法有两个,第一个省时省力,但在导出带动画得模型时会出问题。第二种是我比较喜欢得,多了几个步骤,但对所有得模型都适用。
方法一:
使用 Blender 自带得更正旋转得功能 (是个试验选项)
-
- 在 Blender 中将模型绕 z 轴旋转 180°
- 按 ctrl + A -> apply all transform
- 按 file -> export fbx 导出 fbx 文件
- 在导出界面上 Transform 那一栏里勾选 Apply Transform
- 按 file -> export fbx 导出 fbx 文件
方法二(推荐):
直接在 Blender 里调整旋转角度,使用默认导出。
-
- 在 Blender 中将模型绕 z 轴旋转 180°
- 按 ctrl + A -> apply all transform
- 按 R -> X -> -90
- 按 ctrl + A -> apply all transform
- 按 R -> X -> 90,这步后不需要 apply transform
- 按 file -> export fbx 导出 fbx 文件
- 直接导出即可
从上图可以看到经过处理得模型再导入到 Unity 后朝向是沿 +z,Transform 中得 rotation 也全都为0。
Last but Not Least
最后还有一点小问题需要解决。
在模型导入 Unity 后,如果仔细观察会发现,在 Transform 里得 Scale 显示得是 100 * 100 * 100。如果将其改成 1,模型会缩得非常小。
解决方法也很简单。只要在模型导入时候将 Convert Units 不勾选就可以了。
将模型拖拽到 Scene 以后,点击 Transform 属性上竖着得3个点,然后选择 reset 就行了。
Great content! Keep up the good work!