当前位置:   article > 正文

Unity 模型中心点偏移问题解决方法_unity 物体的坐标不在模型中心

unity 物体的坐标不在模型中心

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

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

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

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

代码如下:

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class AutoModelCenter
  4. {
  5. /// <summary>
  6. /// 获取模型的中心点
  7. /// </summary>
  8. [MenuItem("SKFramework/Tools/GetModelCenter")]
  9. public static void GetModelCenter()
  10. {
  11. //如果未选中任何Transform return
  12. if (Selection.activeTransform == null) return;
  13. Transform transform = Selection.activeTransform;
  14. Bounds bounds = new Bounds(Vector3.zero, Vector3.zero);
  15. //获取所有MeshRenderer 包括子物体
  16. var mrs = transform.GetComponentsInChildren<MeshRenderer>(true);
  17. Vector3 center = Vector3.zero;
  18. for (int i = 0; i < mrs.Length; i++)
  19. {
  20. center += mrs[i].bounds.center;
  21. //Encapsulate函数重新计算bounds
  22. bounds.Encapsulate(mrs[i].bounds);
  23. }
  24. center /= mrs.Length;
  25. //创建一个新物体作为空父级
  26. GameObject obj = new GameObject();
  27. obj.name = transform.name;
  28. obj.transform.position = center;
  29. obj.transform.rotation = Quaternion.identity;
  30. obj.transform.SetParent(transform.parent);
  31. transform.SetParent(obj.transform);
  32. }
  33. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/390844
推荐阅读
相关标签
  

闽ICP备14008679号