如何绘制任意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
相关产品推荐
相关产品推荐

