Blender 到 Unity 的正确导出

这个坑是关于 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 就行了。

One Reply to “Blender 到 Unity 的正确导出”

Leave a Reply