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

举报
CoderZ1010 发表于 2022/09/25 05:46:14 2022/09/25
【摘要】 开发过程中我们可能会遇到这样的模型: 模型的坐标点与其实际位置相差甚远,这时如果想要操作这个物体的Transform则不能得到预想的结果。例如我们现在旋转上图例中的车轮: 解决这种问题的思路是,创建一个新物体作为该模型物体的父级,新物体的坐标位置设为该模型的中心点位置,手动的去设置这个位置会比较麻烦,也不能做到十分精确,这时...

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

模型的坐标点与其实际位置相差甚远,这时如果想要操作这个物体的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);
          }
      }
  
 

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

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/122873706

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。