You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动