如果你也经历过这样的事:从某个三维软件里辛辛苦苦调好的模型,导出FBX,拿到Blender里一打开,原本该是几厘米的小零件,变成了几十米高的庞然大物;或者一个两米多高的角色模型,缩成了蚂蚁大小,还没法直接调。更气人的是,模型看上去尺寸对了,结果绑定骨骼导出到引擎里,动作整体“漂移”得没法看。这些问题的根源,几乎都出在FBX的比例体系和单位换算上。
这篇内容,就是给所有被“Blender FBX比例不对”折磨过的人准备的。我会把FBX导入时比例错乱的原因、判断方法、导入参数的每个选项、以及不同来源模型的具体修正步骤全流程拆开讲。无论你是做静态模型展示、角色绑定,还是游戏资源整理,这套方法基本能覆盖日常遇到的大部分情况。
1. 为什么FBX导入Blender后会比例错乱
先说结论:FBX本身只是一个容器,它里面记录的模型尺寸数值,在不同软件眼里意义完全不同。比例错乱不是Blender的错,也不是导出软件的错,而是大家默认的“单位长度”根本不一样。
1.1 单位制的底层差异:一个“1”各自解读
Blender默认场景单位是米,1个Blender单位(BU)等于1米。这个设定在Blender里非常舒服,做建筑场景的时候,直接按真实尺寸建模,1.8米的角色就建1.8个单位高。
但很多软件不是这样。Maya的默认工作单位是厘米,你在Maya里建一个180高的角色,指的是180厘米,也就是1.8米。当这个模型导出成FBX时,FBX文件里记录的是“180”这个数字。Blender导入FBX时,默认会把“180”当成180米来解读——一个原本1.8米高的模型,进来就变成了180米高,直接放大100倍。
3ds Max的情况更复杂一点。它的系统单位默认是1单位等于1英寸,而显示单位可能被设置成厘米,但真正导出FBX时,按系统单位换算。如果系统单位是英寸,一个72英寸高(约1.83米)的角色导出后,FBX里记录的是72,Blender导入后会当成72米,放大倍数就变成39.37倍左右。
Unity和Unreal这类游戏引擎的默认单位是米,它们导出的FBX通常不会出现比例问题,但会带来坐标轴方向的问题,这个后面提。
单位差异是比例问题的第一层“元凶”,我见过太多人在Blender里把整个场景手动放大缩小,折腾半天最后还是乱的。
1.2 场景里的Unit Scale也会坑人
除了软件间的单位差异,Blender场景自身的单位设置也会干扰导入结果。很多人在Blender里做细节雕刻时,会把Scene菜单下的Unit Scale改成0.01,也就是让1个单位等于1厘米,方便用小数来建模。
这时候再去导入FBX,会发现连原本正常的模型都变大了或变小了。因为FBX导入器会参考场景单位来处理Scale参数,场景单位已经不是默认的1:1,换算关系就全乱套了。
我个人的建议是:除非有特殊需要,否则Blender场景单位保持默认(长度单位:米,Unit Scale:1.0)。如果必须改单位,那导入FBX前把单位恢复默认,导入完成后再改回去,否则你会被各种倍率绕晕。
1.3 坐标轴系统的差异:模型“躺倒”的另一半原因
比例问题之外,FBX还有坐标轴问题。很多刚接触跨软件流程的人会发现,模型导入后不是躺着就是脸朝后,这其实是坐标轴约定不同。
Blender默认是Z轴向上,也就是竖直方向是Z。而大部分游戏引擎和Maya新版是Y轴向上。3ds Max也是Z轴向上,但它的前向轴定义和Blender又不一样。
FBX导入器里Forward和Up参数,就是用来做坐标轴映射的。调错了比例没错、大小没问题,模型也会歪着、躺着或者翻转。这种问题虽然不直接改变尺寸,但会让人误以为“比例也错了”,其实是两件事叠加在了一起。
1.4 “变了形的Scale”才是大部分问题的元凶
单位换算是对“数字”的误解,还有一种情况是模型本身带着一个没被应用的缩放值。
比如某个开发者在建模软件里做了一半,突然发现整体比例需要放大,于是随手按S键缩放了模型,没有应用缩放(Apply/Collapse变换)就导出了FBX。结果FBX文件里不但记录了模型的几何尺寸,还带着一个非1的Scale属性。
Blender导入后,这个Scale会被保留下来。表面上看模型尺寸不对,你去调整Dimensions,却发现怎么改都有一部分奇怪的偏移。尤其是带骨骼的角色,如果骨架的Scale不是全1,动画位移会被叠加放大,角色走着走着就“飞”起来了。这一类问题,单纯调导入参数没用,必须先应用变换。
2. 动手前先做减法:定位比例问题的三个步骤
拿到一个比例不对的FBX,先别急着乱缩放,先把问题定性。是单位理解错了、场景设置超了,还是模型本身就带着脏数据?按下面三步排查,基本能定位。
2.1 第一步:检查Blender场景单位
先看Blender的属性面板(Properties)里的Scene,找到Units,把Length设置成Meters,Unit Scale设回1.0。这是所有判断的前提。
我记得有一个项目,同事从某软件导出一个建筑模型,导入Blender后整体大了好多倍。我过去一看,场景的Unit Scale是0.01,导入器的Scale又是默认1.0,双重叠加,比例直接乱了套。把Unit Scale改回1.0,重新导入,一切正常。
所以,检查场景单位永远第一步。
2.2 第二步:测量导入模型的实际尺寸
模型导入后,选中它,按N键打开右侧属性栏,在Object面板里能看到Dimensions(尺寸)信息。这里的数值,就是Blender当前解读出来的长宽高。
现在比较一下:你期望这个模型在真实世界里应该是多少米?比如一个角色应该是1.8米高,导入后Dimensions显示180米,那差距就是100倍。再比如导入后显示2.5,而实际应该是2.5米,那就是没问题的。
如果模型是倾斜的,Dimensions显示的是一个轴向混合后的边界框尺寸,不直观。可以先用旋转修正把模型放正了再测量。放正的方法后面会讲。
2.3 第三步:算一下自己需要的倍率
这一步是数学题。假设你期望的目标长度是A(单位:米),导入Blender后的实测长度是B(单位:米),那么修正倍率就是:
修正倍率 = A / B
比如角色实测180米,期望1.8米,倍率就是1.8 / 180 = 0.01。下一步要么在导入器里把Scale填成0.01,要么导入后整体缩放0.01。
遇到从英寸系统来的模型,也可以按这个逻辑推。实测尺寸如果刚好是期望尺寸的39.37倍,那基本可以确认源单位是英寸,倍率就是0.0254。反向操作的时候反着用就行:导出到英寸系统,倍率填39.37。
这个实测反推的方式,比依赖软件设置界面里的单位选项要可靠得多。因为很多软件导出时是否写入单位信息,跟版本、插件、勾选选项都有关系,你根本没法猜它到底写了什么,但是模型的实际数值骗不了人。
3. FBX导入面板参数详解
Blender的FBX导入面板,很多人只会看Scale一个值,但其它几个选项和比例问题密切相关。只要花五分钟把这些参数搞清楚,以后遇到场景就再也不用靠运气瞎试。
3.1 Scale参数:倍率到底怎么填
导入面板里第一个要看的参数就是Scale。它的含义是把FBX文件里的单位数值,乘以你填的这个倍率,再作为Blender单位(默认米)来导入。
如果确认源单位是厘米,期望结果是米,就填0.01。如果是英寸,就填0.0254。如果本来就是米,填1.0。
需要特别注意:不要为了贪图方便,在Scale里填一个极端值,比如0.0001。有些复杂的模型,尤其带骨骼和动画的,极端Scale会导致浮点精度问题,后续绑定和动画出奇怪故障。宁可导入后整体缩放并应用变换,也不要依赖超小Scale。
3.2 Forward与Up:坐标轴选择是模型不歪的关键
Forward代表FBX文件的哪根轴是模型前方,Up代表哪根轴是垂直向上的。Blender的坐标系里,默认Up是Z,Forward是X。
从Y轴向上的软件(比如Unity、新版Maya)导出的FBX,一般需要把Up设为Y,Forward根据模型的朝向选X或-Y。具体是哪个,取决于建模时哪个方向算“正面”。从Z轴向上的软件(比如3ds Max),通常保持Up为Z。
如果模型导入后躺在地上,那就是Up没选对。如果模型站立但脸朝后,那就是Forward选反了。试几次就能确定,每次导入后用方向键旋转视角看下模型朝向就行。
3.3 Armature与骨骼选项:角色模型比普通物体多出的坑
如果导入的是带骨骼的角色模型,面板里会多出一堆跟骨骼相关的选项。
Automatic Bone Orientation(自动骨骼方向)默认是勾选的,大多数情况下能自动把骨骼朝向修正得正确。但如果导入后骨骼扭转、角色动作扭曲,可以尝试取消勾选再重导。
Use Pre/Post Rotation这组参数和“Pre Rotation”有关,建议保持默认,除非你明确知道某个软件需要特定的旋转修正。
这里要强调一个经验:带骨骼角色,最忌讳导入后直接对Armature对象做非均匀缩放(比如X轴1.0、Y轴0.5、Z轴1.0)。骨骼的Scale一旦变成非均匀值,所有子级骨骼的变换都会被错误叠加,动画系统算出的位移路径能跑到天上。真需要改角色比例,要么在导出前改,要么导入后处于编辑模式改骨骼长度,而不是对象模式整体缩放。
3.4 Apply Transform的勾选时机
导入面板里有个Apply Transform选项。勾选后,Blender会把FBX里带的旋转和缩放信息,应用到对象数据本身,而不是保留在对象属性里。
对于绝大多数场景,我会建议勾选它。这样导入后的模型Scale是干净的全1,再去调整Dimensions、绑定骨骼、二次导出,都不会被隐藏的旧变换干扰。
不勾的情况也有,比如你想保留原始FBX里的变换信息做某种对比。但如果你不是那种明确知道自己在做什么的老手,就不要取消这个勾选。
4. 四种常见来源的FBX比例修正实操
有了前面的底子,下面看具体方案。结合源软件类型分四种场景,每一种都能直接照着做。
4.1 方案一:从以“厘米”为单位的软件导出
Maya、部分CAD软件默认以厘米建模,这种FBX导入Blender后最常见的现象是放大了100倍。
完整步骤:
- 打开Blender,先确认场景单位是米、Unit Scale是1.0。
- 菜单File → Import → FBX,选择文件。
- 在导入面板左侧,把Scale填成0.01。
- 保持Forward和Up的自动检测值,如果模型方向不对再切换。
- 导入完成后,选中模型,按N键查看Dimensions,确认尺寸已经变成期望的米单位。
- 模型没问题后,按Ctrl+A应用全部变换,把Scale归1。
如果这个FBX之前已经被导入了,现在模型已经躺在场景里:选中模型,进入编辑模式,按A全选,S键缩放0.01,回到对象模式,然后Ctrl+A应用变换。用编辑模式缩放是因为它能直接改几何数据,避免在对象上留下极小的Scale值。
4.2 方案二:从以“英寸”或“英尺”为单位的软件导出
3ds Max默认系统单位是英寸,SketchUp部分模板也用英寸。这类模型导入Blender后,常见现象是放大39.37倍左右。
如果实测是39.37倍,Scale填0.0254。如果对比下来发现是12倍(英尺的情况),源单位就是英尺,倍率是0.3048。
有个很隐蔽的坑:3ds Max里可以把显示单位改成厘米,看起来好像建模时用的是厘米,但系统单位如果还是英寸,FBX导出后记录的仍然是英寸数值。判断标准只有一个,那就是实测尺寸和期望尺寸的比例,不要被显示单位欺骗。
4.3 方案三:从以“米”为单位的引擎或软件导出
Unity、Unreal、Blender互导,比例单位基本一致,Scale可以不改。但坐标轴问题比较突出,因为引擎大多是Y轴向上。
从Unity导出FBX导入Blender时,我一般先保持Forward和Up的自动值。如果模型躺倒,就把Up改成Y。如果朝向不对,试一下Forward为X、-X、Y这些选项。
带动画的角色从引擎导出,我强烈建议在引擎侧导出时把“Bake Animation”和“Apply Unit Scale”等选项理顺,再进入Blender。否则导入后动画曲线里记录的位移数值会被骨架Scale放大,出现角色位移跟动画对不上的情况。
4.4 方案四:已经导入了又不想重导:对象模式下的补救
有时候模型已经被加入场景,调整了材质、打好了灯光,不想重新导入覆盖。那就直接在场景里修正比例。
前提是先分清模型有没有被施加过非均匀缩放。选中对象,看N面板Object下的Scale三个值:如果三个值都是一样的,比如(0.01,0.01,0.01),可以直接在编辑模式A全选,S放大100倍或缩小,然后Ctrl+A应用Scale。
如果Scale三个值不一样,或者有负数,比如(-0.02,0.01,0.03),那就不要用编辑模式乱搞了,否则法线、UV、骨骼全都会出问题。先把Scale归0清理一下旧变换:Ctrl+A选择“缩放”,如果还存在翻转情况(负数Scale),进入编辑模式A全选,Mesh → Normals → Recalculate Outside重新计算法线。解决完人体工学问题再去缩放。
无论用哪种补救方式,改完比例后一定要检查一遍原点位置,否则旋转和缩放的中心会偏到看不到的地方,这一步别省。
5. Python脚本批量修正与场景级处理
当场景里有几十上百个物体,都从同一个FBX里来,逐个手工缩放肯定不现实。这时可以直接写一个Python脚本,批量搞定。
5.1 场景内所有物体的统一缩放脚本
最保守的方案是遍历当前场景所有Mesh对象,把Scale乘上一个系数,然后把变换应用掉:
import bpy # 传入缩放系数,比如 0.01 factor = 0.01 for obj in bpy.context.scene.objects: if obj.type == 'MESH': # 跳过隐藏对象,防止意外操作 if obj.hide_viewport: continue # 记录世界坐标位置 loc = obj.location.copy() # 对三个轴统一缩放 obj.scale[0] *= factor obj.scale[1] *= factor obj.scale[2] *= factor # 设为活动对象并应用变换 bpy.ops.object.select_all(action='DESELECT') obj.select_set(True) bpy.context.view_layer.objects.active = obj bpy.ops.object.transform_apply(scale=True) print("批量缩放完成")这个脚本的适用场景是:模型各自的父级关系不复杂,或者结构相对独立。对于有复杂父子链的模型,直接改每个Mesh的Scale会连累子级变换,容易出错。这时候我一般建议选中根对象,整体缩放后应用一次变换,多个Mesh会随根对象的全局变换一起变化。
5.2 连骨骼与动画一起处理的脚本
当角色带Armature时,最好只对Armature根对象应用缩放,并应用变换,让所有骨骼和网格跟随:
import bpy factor = 0.01 arm = bpy.context.active_object if arm and arm.type == 'ARMATURE': # 尽量保证骨骼 Scale 三轴一致 arm.scale[0] *= factor arm.scale[1] *= factor arm.scale[2] *= factor bpy.ops.object.transform_apply(scale=True) print("骨骼缩放已应用,请检查动画曲线") else: print("请先选中一个Armature对象")注意,无论脚本多方便,执行前都先备份原文件一次。你永远不知道那个“仿佛没问题”的模型,会不会在应用变换时把整个骨骼链打散。我至少碰到过两次:脚本跑完,动画曲线还在,但骨骼层级全乱了,最后只能Ctrl+Z撤回。
5.3 导入前自检清单
最后给一个拿来即用的自检清单,每次导入FBX前过一遍:
- Blender场景单位是否为米,Unit Scale是否为1.0。
- 确认源软件的系统单位是厘米、英寸、还是米。
- 确认导入面板里的Scale是否按源单位换算成倍率。
- 确认Up轴是根据源软件坐标设置了Y还是Z。
- 确认模型在导入后Dimensions是否等于期望尺寸。
- 如果是角色模型,检查骨骼Scale是否全1,动画位移是否正常。
- 如果二次导出到别的软件,先在Blender里应用全部变换。
这一套下来,虽然不能保证一个意外都不出,但最常见的比例问题基本都堵住了。
6. 常见问题与排查技巧实录
下面这些情况,都是实际过程中反复踩过的坑,按现象和解决方案整理出来,遇到类似问题可以直接对照。
6.1 模型坐标飞了,原点跑到奇怪的地方
修正比例后,模型位置变得特别远,缩放时不是从中心缩放,而是从一个看不见的角落缩放。
最常见的原因是原点不在模型中心,或者模型离场景世界原点太远。解决办法:如果想以世界原点为参考,把3D游标归零(Shift+S → Cursor to World Origin);选中模型,右键Set Origin → Origin to 3D Cursor,把原点设置到游标位置。
如果模型本身很大,可以先按属性栏里的Dimensions把尺寸调整好,再设置原点到几何中心。这样无论后续旋转、缩放、镜像还是绑定,都会以模型自身几何中心为参照点。
6.2 角色骨骼缩放后动作整体“漂移”
这是最典型的一种“比例没问题但动画有问题”的现象。模型尺寸看着正确了,Armature的Scale是全1,但一旦播放动画,角色整体会慢慢漂移。
大概率是导入前,原有骨骼或者根对象带有一个非1的初始Scale,FBX导入时没有应用掉,动画曲线里记录的位移数据被Scale放大了。处理方法:重新导入,在导入面板勾选Apply Transform;如果还不行,检查Armature根骨骼是否有额外的骨骼缩放,把它归1。
如果动画是从引擎侧导出的,建议在引擎侧勾选“Bake Animation”并确认单位转换正确。某些引擎导出时,如果原始资源是按厘米建模,但引擎按米处理,动画里也会欠一笔缩放账,这种就不是Blender单方面能根治的了。
6.3 非均匀缩放导致法线异常
有人会用快捷键S,单轴缩放来调整模型比例。比如把角色压扁一点、拉长一点。这个操作如果用非均匀缩放,模型面片的法线方向就会出问题,表现是模型表面出现奇怪的明暗交界线,或者渲染时高光方向不对劲。
处理方法:先Ctrl+A应用Scale(包括非均匀缩放),然后进入编辑模式,A全选,Mesh菜单 → Normals → Recalculate Outside。如果还有问题,用右键 → Shade Smooth重新设置着色。真正要做非均匀比例的模型,尽量在建模阶段就做,不要留着非均匀Scale到处导。
6.4 修正完比例模型又沿某轴旋转了90度
模型大小终于对了,但扫一眼发现它横过来了,或者转了90度。
这种情况基本就是Forward/Up轴没设置对。不要急着手动旋转模型修正,先记录当前设置的Forward和Up,切换成另一组。通常由Y-Up系统导出,导入Blender时把Up选为Y;由Z-Up系统导出,把Up保持为Z。Forward决定朝向,分别试X、-X、Y、-Y、Z、-Z,直到模型朝向你想要的“正面方向”。
有人会问:我手动旋转一下不就行了吗?如果只是静态展示,手动旋转完全可以。但后续要添加动画、发送到游戏引擎,原始数据的方向很关键,手转只会把烂摊子甩给下游,所以还是回到导入面板重导一次最稳妥。
6.5 缩放后材质和贴图看起来变糊了
模型比例修正后,材质和贴图没有失效,但纹理变得模糊或有锯齿。这其实不是贴图分辨率丢了,而是模型UV没有自动适配新的几何尺寸。UV是跟着顶点坐标走的,比例缩放后UV坐标自然会产生拉伸。
如果只是整体等比缩放,UV不会变形,只是纹理在表面上的密度变了,这通常是正常的。真正需要处理的是非均匀缩放的情况,这时UV发生不均匀拉伸,纹理就会出现怪异感。没有万能的自动修复办法,只能回到编辑模式,重新调整受影响部位的UV,或者用专门的Unwrap工具重新展开。
6.6 参考:常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 导入后放大100倍 | 源单位是厘米,被当成米 | Scale设为0.01,或整体缩放后应用 |
| 导入后放大39.37倍左右 | 源单位是英寸,被当成米 | Scale设为0.0254左右 |
| 模型躺倒或翻转 | Forward/Up轴设置不对 | 调整Up为Y或Z,Forward尝试各轴 |
| 模型尺寸对但动画漂移 | 骨骼存在未应用的Scale | 勾选Apply Transform重导,检查根骨骼Scale |
| 模型阴影异常 | 非均匀缩放 | 应用Scale并重算法线 |
| 原点偏移 | 原点不在模型中心 | Set Origin到几何中心或3D游标 |
这部分内容整理下来,日常碰到的问题基本都能对上号了。把比例问题的底层逻辑搞明白,比背一百个参数有用得多——因为你推导得出倍率,就永远不会被某个软件的“单位显示”骗得团团转。
我个人在实际操作中的体会是:跨软件导FBX,最重要的是培养一个“先测量、后动手”的意识。每次导入模型后,先看Dimensions,先确认Scale干净,再谈后续调整。这个习惯帮我省掉了无数次返工和重导的操作。还有一个细节,导出FBX前看一眼导出面板里的单位相关选项,能在源头消掉一大半麻烦。比例这事,一旦源头错了,下游再怎么弥补都带着一股“怎么都不对”的别扭感,所以宁可多花一分钟检查,也不要进到下一个软件里再挣扎半天。