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

如何绘制任意3D物体的边界?附立方体实现代码示例

如何绘制任意3D物体的边界?

嘿,很高兴你已经搞定了立方体的边界绘制!要把这个逻辑扩展到任意3D物体,其实只需要调整几个关键细节,我来给你梳理清楚:

核心思路:利用Unity的Bounds类

Unity内置的Bounds已经帮我们封装了包围盒的所有计算,不管是简单的立方体还是复杂的自定义Mesh,都能轻松获取边界顶点。你之前手动计算立方体顶点的思路没问题,但对于任意物体,我们可以用更通用的方法。

改进后的通用实现代码

下面是适配任意3D物体的边界绘制代码(以Gizmos调试为例,也可以改成LineRenderer在Game视图显示):

void DrawObjectBounds(GameObject targetObject)
{
    // 先获取物体的Renderer组件(支持MeshRenderer、SkinnedMeshRenderer)
    Renderer targetRenderer = targetObject.GetComponent<Renderer>();
    if (targetRenderer == null)
    {
        Debug.LogError("目标物体缺少Renderer组件,无法计算边界!");
        return;
    }

    // 获取世界空间下的包围盒(自动处理缩放、旋转、位移)
    Bounds worldSpaceBounds = targetRenderer.bounds;

    // 直接获取包围盒的8个顶点(世界空间坐标)
    Vector3[] boundsCorners = new Vector3[8];
    worldSpaceBounds.GetCorners(boundsCorners);

    // 绘制边界线:顶面四条边
    Gizmos.DrawLine(boundsCorners[0], boundsCorners[1]);
    Gizmos.DrawLine(boundsCorners[1], boundsCorners[2]);
    Gizmos.DrawLine(boundsCorners[2], boundsCorners[3]);
    Gizmos.DrawLine(boundsCorners[3], boundsCorners[0]);
    // 底面四条边
    Gizmos.DrawLine(boundsCorners[4], boundsCorners[5]);
    Gizmos.DrawLine(boundsCorners[5], boundsCorners[6]);
    Gizmos.DrawLine(boundsCorners[6], boundsCorners[7]);
    Gizmos.DrawLine(boundsCorners[7], boundsCorners[4]);
    // 垂直连接边(顶底对应顶点)
    Gizmos.DrawLine(boundsCorners[0], boundsCorners[4]);
    Gizmos.DrawLine(boundsCorners[1], boundsCorners[5]);
    Gizmos.DrawLine(boundsCorners[2], boundsCorners[6]);
    Gizmos.DrawLine(boundsCorners[3], boundsCorners[7]);
}

关键细节说明

  • 为什么用Renderer.bounds?
    你之前用的MeshFilter.sharedMesh.bounds是本地空间的包围盒,没有考虑物体的缩放、旋转和位移,绘制出来的边界不会跟着物体移动。而Renderer.bounds直接给出世界空间下的正确包围盒,自动适配所有变换。
  • 支持动画物体:如果是带骨骼动画的角色,用SkinnedMeshRenderer.bounds就能实时获取动画播放中的动态边界。
  • 绘制方式灵活:示例用Gizmos适合Scene视图调试;如果要在Game视图显示,只需要把这些顶点按顺序传给LineRenderer组件即可。

对你原有代码的小优化

如果你坚持想用手动计算顶点的方式,记得把本地空间的顶点转换到世界空间:

// 把你计算的本地顶点转成世界坐标
v3FrontTopLeft = objectToDrawTransform.TransformPoint(v3FrontTopLeft);
v3FrontTopRight = objectToDrawTransform.TransformPoint(v3FrontTopRight);
// 其他顶点同理...

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:33