You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:50:06