Unity 模型中心点偏移问题解决方法

开发过程中我们可能会遇到这样的模型:

模型的坐标点与其实际位置相差甚远,这时如果想要操作这个物体的Transform则不能得到预想的结果。例如我们现在旋转上图例中的车轮:

解决这种问题的思路是,创建一个新物体作为该模型物体的父级,新物体的坐标位置设为该模型的中心点位置,手动的去设置这个位置会比较麻烦,也不能做到十分精确,这时我们需要用到Bounds类Encapsulate函数去计算中心点位置:

因此我们需要获取该模型物体的所有MeshRenderer,包括子物体,声明一个新的Bounds包围盒,遍历所有的MeshRenderer,调用Encapsulate函数去计算包围盒的边界及中心。

代码如下:

using UnityEngine;
using UnityEditor;

public class AutoModelCenter
{
    /// <summary>
    /// 获取模型的中心点
    /// </summary>
    [MenuItem("SKFramework/Tools/GetModelCenter")]
    public static void GetModelCenter()
    {
        //如果未选中任何Transform return
        if (Selection.activeTransform == null) return;
        Transform transform = Selection.activeTransform;
        Bounds bounds = new Bounds(Vector3.zero, Vector3.zero);
        //获取所有MeshRenderer 包括子物体
        var mrs = transform.GetComponentsInChildren<MeshRenderer>(true);
        Vector3 center = Vector3.zero;
        for (int i = 0; i < mrs.Length; i++)
        {
            center += mrs[i].bounds.center;
            //Encapsulate函数重新计算bounds
            bounds.Encapsulate(mrs[i].bounds);
        }
        center /= mrs.Length;
        //创建一个新物体作为空父级
        GameObject obj = new GameObject();
        obj.name = transform.name;
        obj.transform.position = center;
        obj.transform.rotation = Quaternion.identity;
        obj.transform.SetParent(transform.parent);
        transform.SetParent(obj.transform);
    }
}

有了该工具后我们就可以获得车轮的中心点,然后就可以正常旋转它了:

  • 23
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderZ1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值