赞
踩
开发过程中我们可能会遇到这样的模型:
模型的坐标点与其实际位置相差甚远,这时如果想要操作这个物体的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);
- }
- }
有了该工具后我们就可以获得车轮的中心点,然后就可以正常旋转它了:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。