共计 1884 个字符,预计需要花费 5 分钟才能阅读完成。
在 3D 建模和动画制作中,模型中心与世界中心的对齐问题经常被忽视,但却可能导致一系列后续问题。今天我们就来深入探讨这个看似简单实则关键的环节。

问题背景
首先让我们理解为什么模型中心对齐如此重要。在 Blender 中工作时,我们经常会遇到以下场景:
- 导入外部模型时,模型可能偏离世界中心
- 进行旋转动画时,模型绕着错误的轴心旋转
- 添加物理模拟时,碰撞计算基于错误的位置
- UV 展开和纹理映射出现意外的偏移
这些问题都源于模型局部坐标系与世界坐标系的不一致。更糟糕的是,这种问题往往不会立即显现,而是在项目后期才突然爆发。
技术方案对比
方案 1:手动调整原点
这是最直观的解决方案,操作步骤简单:
- 选中目标模型
- 进入 Object 模式
- 选择 Object > Set Origin > Origin to Geometry
适用场景:
– 单个简单模型的快速调整
– 需要保留原始变换数据的情况
精度限制:
– 对复杂层级结构的模型效果有限
– 不能自动处理多物体组合
方案 2:几何中心校正
这个方法更彻底,直接修改网格数据:
- 进入 Edit 模式
- 全选所有顶点
- Mesh > Transform > Geometry to Origin
数学原理:
这个方法计算所有顶点的几何中心,然后将整个网格平移,使中心点与世界原点重合。数学表达式为:
偏移向量 = - 几何中心
每个顶点 += 偏移向量
方案 3:Python 脚本批量处理
对于需要处理大量模型的生产环境,自动化脚本是更好的选择。以下是完整的 bpy 代码示例:
import bpy
import numpy as np
# 获取选中物体
selected_objects = bpy.context.selected_objects
for obj in selected_objects:
# 确保是网格物体
if obj.type != 'MESH':
continue
# 进入编辑模式
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
# 计算几何中心
mesh = obj.data
verts = [v.co for v in mesh.vertices]
center = sum(verts, Vector()) / len(verts)
# 应用偏移
bpy.ops.transform.translate(value=-center)
# 返回物体模式
bpy.ops.object.mode_set(mode='OBJECT')
# 重置变换
obj.location = (0, 0, 0)
obj.rotation_euler = (0, 0, 0)
obj.scale = (1, 1, 1)
核心实现细节
坐标系转换矩阵
在处理坐标转换时,理解变换矩阵至关重要。一个典型的平移矩阵如下:
[1, 0, 0, Tx]
[0, 1, 0, Ty]
[0, 0, 1, Tz]
[0, 0, 0, 1]
其中 Tx, Ty, Tz 就是我们需要的偏移量。在 Blender 中,这个矩阵可以通过以下代码构建:
import mathutils
translation = mathutils.Matrix.Translation(-center)
保持 UV 不变
移动几何体时,UV 坐标会受到影响的常见问题是顶点位置改变导致贴图错位。解决方法是:
- 在执行几何变换前备份 UV 数据
- 应用变换
- 恢复原始 UV 坐标
相关代码片段:
# 备份 UV
uv_layer = mesh.uv_layers.active.data
original_uvs = [uv.uv.copy() for uv in uv_layer]
# 应用变换后恢复 UV
for i, uv in enumerate(uv_layer):
uv.uv = original_uvs[i]
生产环境考量
FBX/GLTF 导出问题
不同引擎对坐标系的理解可能不同:
- Unity 使用 Y 轴向上
- Unreal 使用 Z 轴向上
- Blender 默认是 Z 轴向上
导出时需要特别注意:
- 在导出设置中检查轴向设置
- 考虑添加额外的根节点来补偿引擎差异
- 测试导出后模型在不同引擎中的表现
多物体组合模型
对于由多个子物体组成的复杂模型:
- 先处理各个子物体的几何中心
- 然后调整父物体的变换
- 检查父子关系的继承是否正确
避坑指南
非均匀缩放问题
模型缩放不均匀 (如 X:1, Y:2, Z:1) 会导致:
- 法线计算错误
- 物理碰撞形状变形
- 动画变形异常
解决方法:
- 应用缩放(Ctrl+ A 选择 Scale)
- 检查法线方向
- 必要时重新计算切线空间
骨骼动画处理
处理带骨骼的模型时需要额外步骤:
- 先处理网格几何中心
- 然后调整骨骼位置
- 检查权重映射是否正常
- 测试所有动画片段是否正常播放
思考题
当模型需要同时适配 Unity 和 Unreal 引擎时,坐标系处理策略会有哪些不同?欢迎在评论区分享你的经验和见解。
正文完
