Unity中Master旋转时子物体轴向对齐包围盒过大问题求解
解决Unity中旋转父物体后子物体包围盒尺寸过大的问题
我需要给名为"Master"的父GameObject创建一个轴向对齐包围盒,包裹它的所有子物体。原本的实现代码如下:
var grpBounds = new Bounds() { center = master.transform.position }; foreach (var meshrenderer in master.transform.GetComponentsInChildren<MeshRenderer>()) { grpBounds.Encapsulate(meshrenderer.bounds); } boundingbox.localScale = grpBounds.size; boundingbox.position = grpBounds.center;
但这段代码的问题在于,Encapsulate()是在世界空间计算包围盒,当Master旋转后,包围盒仍保持世界轴向,导致尺寸被不必要地放大,无法贴合旋转后的子物体集群。
最优解决方案:在父物体本地空间计算包围盒
核心思路是将所有子物体的边界转换到Master的本地空间后合并,这样得到的包围盒轴向会和Master保持一致,旋转时也能同步贴合。
方案1:将包围盒设为Master的子物体(推荐)
这种方式最直接,包围盒会自动跟随Master的旋转和移动:
Transform masterTrans = master.transform; // 初始化本地空间包围盒,中心从原点开始 Bounds localGroupBounds = new Bounds(Vector3.zero, Vector3.zero); // 遍历所有子物体的MeshRenderer(包含禁用物体可加true参数) foreach (var renderer in masterTrans.GetComponentsInChildren<MeshRenderer>()) { // 将子物体的世界空间边界转换为Master本地空间 Bounds localChildBounds = masterTrans.InverseTransformBounds(renderer.bounds); // 在本地空间合并边界 localGroupBounds.Encapsulate(localChildBounds); } // 将包围盒设置为Master的子物体 boundingbox.transform.SetParent(masterTrans); // 设置本地位置和尺寸 boundingbox.transform.localPosition = localGroupBounds.center; boundingbox.transform.localScale = localGroupBounds.size;
方案2:包围盒独立于Master(无需设为子物体)
如果需要包围盒保持独立,可以将本地空间的边界再转换回世界空间,并同步旋转:
Transform masterTrans = master.transform; Bounds localGroupBounds = new Bounds(Vector3.zero, Vector3.zero); foreach (var renderer in masterTrans.GetComponentsInChildren<MeshRenderer>()) { Bounds localChildBounds = masterTrans.InverseTransformBounds(renderer.bounds); localGroupBounds.Encapsulate(localChildBounds); } // 将本地空间边界转换为世界空间 Bounds worldGroupBounds = masterTrans.TransformBounds(localGroupBounds); // 设置包围盒的世界位置和尺寸 boundingbox.transform.position = worldGroupBounds.center; boundingbox.transform.localScale = worldGroupBounds.size; // 同步包围盒旋转与Master一致,保证轴向对齐 boundingbox.transform.rotation = masterTrans.rotation;
注意点
- 若要包含禁用状态的子物体,需修改遍历代码为
masterTrans.GetComponentsInChildren<MeshRenderer>(true) InverseTransformBounds和TransformBounds会自动处理子物体的缩放、旋转带来的边界变化,无需额外计算
内容的提问来源于stack exchange,提问作者KarlSupertramp
相关产品推荐
相关产品推荐

