Unity中如何将轴心点移至模型视觉中心?
解决Unity中NX CAD模型导入后轴心/中心偏移的问题
我之前也碰到过NX模型通过PiXYZ导入Unity后,轴心错位、gameObject.position和实际模型中心不符的糟心事,结合你提到的旋转物体需求,给你几个实际验证过的解决方案:
1. 优先用PiXYZ自带的轴心调整工具
PiXYZ针对CAD模型的导入做了专门优化,自带的轴心调整功能比第三方脚本更适配:
- 选中导入后的模型部件,在Inspector面板的PiXYZ专属设置里找到Pivot/Origin相关选项
- 尝试选择「Set Pivot to Bounding Box Center」(不同版本命名可能略有差异),这个操作会基于模型当前旋转状态下的包围盒重新计算轴心,能完美保留旋转信息,从根源上解决中心偏移问题。
2. 自定义适配旋转的轴心修正脚本
Unity Wiki的SetPivot脚本没考虑旋转对包围盒的影响,我改了一个版本,专门处理带旋转的物体:
using UnityEngine; public class SetPivotWithRotation : MonoBehaviour { [ContextMenu("Set Pivot to Bounds Center")] public void SetPivotToBoundsCenter() { // 获取渲染器的世界空间包围盒(已考虑旋转) Bounds modelBounds = GetComponent<Renderer>().bounds; Vector3 worldCenter = modelBounds.center; // 将世界中心转换为物体局部空间坐标 Vector3 localCenter = transform.InverseTransformPoint(worldCenter); // 计算位置偏移,用于补偿子物体的位置 Vector3 positionOffset = transform.position - worldCenter; // 移动所有子物体,保证它们的世界位置不变 foreach (Transform child in transform) { child.position += positionOffset; } // 调整自身局部位置,让轴心对齐到包围盒中心 transform.localPosition -= localCenter; } }
把这个脚本挂到有问题的模型上,右键点击组件选择「Set Pivot to Bounds Center」,它会自动处理旋转带来的包围盒偏移,调整后gameObject.position就能正确指向模型实际中心了。
3. 空物体代理中心(应急方案)
如果上面的方法暂时没法生效,可以用这个绕路的办法:
- 创建一个空物体,手动移动到Gizmos显示的正确中心位置(也就是模型的实际中心)
- 将原模型设为空物体的子物体
- 之后直接通过空物体的
position获取模型中心,空物体可以继承原模型的旋转属性,完全不影响你的旋转需求。
额外小贴士
针对NX模型的旋转混乱问题,在PiXYZ导入时可以尝试勾选「Merge Transformations」或「Flatten Hierarchy」选项,能简化模型的变换层级,减少导入后的旋转异常。
内容的提问来源于stack exchange,提问作者Dmitrijs Bambulaks




