Unity3d bounds包围盒 和collider碰撞器区别
创始人
2024-03-07 18:32:40
0

Bounds 外包围盒

Bounds 叫作外包围盒、边界框、外扩矩形.是struct 结构体。而我们获得Bounds的主要途径有三种:Render,Collider,Mesh。

Render.bounds 世界坐标

Collider.bounds 世界坐标

Mesh.bounds  本地坐标

        var m= GetComponent().bounds;var c = GetComponent().bounds;var r = GetComponent().bounds;

把 Mesh.bounds 本地坐标换算成世界坐标bounds 

  //把本地坐标换算成世界坐标var centerPoint = transform.TransformPoint(bounds.center);Bounds newBounds = new Bounds(centerPoint, bounds.size);

碰撞器绿方框

Bounds和碰撞器的绿方框(绿色线)的区别

碰撞器的方框始终跟着模型旋转移动,缩放跟着模型的,只要模型不缩放它也不缩放

Bounds 跟随模型移动,而不会跟模型着旋转,而是随着模型旋转而缩放变大变小,始终包裹模型.

下面红色方框就是 Bounds 方框

Bounds属性

只读属性

我们不能直接修改 Bounds 结构体里头的 center 和 size 属性都不能直接设置,而且 BoxCollider 的 bounds 属性也不能.

.bounds.center;  //中心点坐标
.bounds.size;        //盒子的总尺寸,xyz长度
.bounds.min;            //最小点的位置:左下角
.bounds.max;                //最大点的位置:右上角
.bounds.center.x;            //中心点的X
.bounds.center.y;                //中心点的Y

Bounds 常用方法

// 点point是否在这个包围盒内部
public bool Contains(Vector3 point);// bounds会自动扩充大小(改变center和extens),来包含这个point
public void Encapsulate(Vector3 point);// bounds会自动扩充大小(改变center和extens),把原本的bounds和传入的bounds都包含进来
public void Encapsulate(Bounds bounds);// 这条射线是否与这个包围盒相交
public bool IntersectRay(Ray ray);//包围盒最近的点
public Vector3 ClosestPoint(Vector3 point);//设置边界框的最小最大值
public void SetMinMax(Vector3 min, Vector3 max);

多物体Bounds, Encapsulate方法

计算多物体Bounds,则要遍历所有子物体,然后调用Encapsulate方法来计算。

Bounds bounds;
Renderer[] renderers = model.GetComponentsInChildren();
for (int i = 0; i < renderers.Length; i++)
{bounds.Encapsulate(renderers[i].bounds);
}


 

计算包围盒的八个顶点

center = bounds.center;
ext = bounds.extents;float deltaX = Mathf.Abs(ext.x);
float deltaY = Mathf.Abs(ext.y);
float deltaZ = Mathf.Abs(ext.z);#region 获取AABB包围盒顶点
points = new Vector3[8];
points[0] = center + new Vector3(-deltaX, deltaY, -deltaZ);        // 上前左(相对于中心点)
points[1] = center + new Vector3(deltaX, deltaY, -deltaZ);         // 上前右
points[2] = center + new Vector3(deltaX, deltaY, deltaZ);          // 上后右
points[3] = center + new Vector3(-deltaX, deltaY, deltaZ);         // 上后左points[4] = center + new Vector3(-deltaX, -deltaY, -deltaZ);       // 下前左
points[5] = center + new Vector3(deltaX, -deltaY, -deltaZ);        // 下前右
points[6] = center + new Vector3(deltaX, -deltaY, deltaZ);         // 下后右
points[7] = center + new Vector3(-deltaX, -deltaY, deltaZ);        // 下后左
#endregion

 

绘制bounds方框

    /// /// 绘制Bounds方框/// /// /// /// /// public static void DrawBoundBoxLine(Bounds bounds, Color color = default(Color), float offsetSize = 1f, float duration = 0.1f){//先计算出包围盒8个点Vector3[] points = new Vector3[8];var width_x = bounds.size.x * offsetSize;var hight_y = bounds.size.y * offsetSize;var length_z = bounds.size.z * offsetSize;var LeftBottomPoint = bounds.min;var rightUpPoint = bounds.max;var centerPoint = bounds.center;var topPoint = new Vector3(centerPoint.x, centerPoint.y + hight_y / 2, centerPoint.z);var bottomPoint = new Vector3(centerPoint.x, centerPoint.y - hight_y * 0.5f, centerPoint.z);points[0] = LeftBottomPoint + Vector3.right * width_x;points[1] = LeftBottomPoint + Vector3.up * hight_y;points[2] = LeftBottomPoint + Vector3.forward * length_z;points[3] = rightUpPoint - Vector3.right * width_x;points[4] = rightUpPoint - Vector3.up * hight_y;points[5] = rightUpPoint - Vector3.forward * length_z;points[6] = LeftBottomPoint;points[7] = rightUpPoint;Debug.DrawLine(LeftBottomPoint, points[0], color, duration);Debug.DrawLine(LeftBottomPoint, points[1], color, duration);Debug.DrawLine(LeftBottomPoint, points[2], color, duration);Debug.DrawLine(rightUpPoint, points[3], color, duration);Debug.DrawLine(rightUpPoint, points[4], color, duration);Debug.DrawLine(rightUpPoint, points[5], color, duration);Debug.DrawLine(points[1], points[3], color, duration);Debug.DrawLine(points[2], points[4], color, duration);Debug.DrawLine(points[0], points[5], color, duration);Debug.DrawLine(points[2], points[3], color, duration);Debug.DrawLine(points[0], points[4], color, duration);Debug.DrawLine(points[1], points[5], color, duration);}

绘制碰撞器方框 -方法1

    /// /// 绘制boxCollider的绿色方框/// /// void DrawGizmosOnRunTime(Color color){var boxCollider = GetComponent();Gizmos.color = color;Matrix4x4 rotationMatrix = Matrix4x4.TRS(boxCollider.transform.position, boxCollider.transform.rotation, boxCollider.transform.lossyScale);Gizmos.matrix = rotationMatrix;Gizmos.DrawWireCube(boxCollider.center, boxCollider.size);}void OnDrawGizmos(){DrawGizmosOnRunTime(Color.red);}

绘制碰撞器方框 -方法2

    /// /// 绘制boxCollider的绿色方框/// /// /// /// public static void DrawOnGameViewRuntime(BoxCollider boxCollider, Color color = default(Color), float offsetSize = 1f){float width = 0.1f;Vector3 rightDir = boxCollider.transform.right.normalized;Vector3 forwardDir = boxCollider.transform.forward.normalized;Vector3 upDir = boxCollider.transform.up.normalized;Vector3 center = boxCollider.transform.position + boxCollider.center;Vector3 size = boxCollider.size * offsetSize;size.x *= boxCollider.transform.lossyScale.x;size.y *= boxCollider.transform.lossyScale.y;size.z *= boxCollider.transform.lossyScale.z;Debug.DrawLine(center + upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, center + upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, color);Debug.DrawLine(center - upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, center - upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, center - upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, center - upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, center + upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center - upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, center - upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, center - upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, center - upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, center + upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center - upDir * size.y / 2f + rightDir * size.x / 2f + forwardDir * size.z / 2f, center - upDir * size.y / 2f + rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center + upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, center + upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, color);Debug.DrawLine(center - upDir * size.y / 2f - rightDir * size.x / 2f + forwardDir * size.z / 2f, center - upDir * size.y / 2f - rightDir * size.x / 2f - forwardDir * size.z / 2f, color);}

求两个包围盒之间的距离

    // Distance between two ClosestPointOnBounds// this is needed in cases where entites are really big. in those cases,// we can't just move to entity.transform.position, because it will be// unreachable. instead we have to go the closest point on the boundary.//// Vector3.Distance(a.transform.position, b.transform.position)://    _____        _____//   |     |      |     |//   |  x==|======|==x  |//   |_____|      |_____|////// Utils.ClosestDistance(a.collider, b.collider)://    _____        _____//   |     |      |     |//   |     |x====x|     |//   |_____|      |_____|//public static float ClosestDistance(Collider a, Collider b){return Vector3.Distance(a.ClosestPointOnBounds(b.transform.position),b.ClosestPointOnBounds(a.transform.position));}

 求点A到包围盒最近的点,ClosestPoint

 计算所有包围盒的中心点

计算出多个Bounds的中心点

[MenuItem ("MyMenu/Do Test")]static void Test () {Transform parent = 	Selection.activeGameObject.transform;Vector3 postion = parent.position;Quaternion rotation = parent.rotation;Vector3 scale = parent.localScale;parent.position = Vector3.zero;parent.rotation = Quaternion.Euler(Vector3.zero);parent.localScale = Vector3.one;Vector3 center = Vector3.zero;Renderer[] renders = parent.GetComponentsInChildren();foreach (Renderer child in renders){center += child.bounds.center;   }center /= parent.GetComponentsInChildren().Length; Bounds bounds = new Bounds(center,Vector3.zero);foreach (Renderer child in renders){bounds.Encapsulate(child.bounds);   }parent.position = postion;parent.rotation = rotation;parent.localScale = scale;foreach(Transform t in parent){t.position = t.position -  bounds.center;}parent.transform.position = bounds.center + parent.position;}

参考 

  https://blog.csdn.net/sinat_25415095/article/details/104588989

https://www.5axxw.com/questions/content/imitu9

相关内容

热门资讯

申请劳动仲裁需要什么材料   申请劳动仲裁需要的三类材料,具体哪些材料?下面就跟小编来了解一下!  申请劳动仲裁需要的材料,可...
社工师加薪申请书 加薪申请书范文(一)尊敬的:您好!我自年月份有幸进入公司以来,近年了,期间始终抱着“是我家,繁荣靠大...
少年先锋队入队申请书 少年先锋队入队申请书  敬爱的少先队:  我自愿加入中国少年先锋队,这是我的梦想,也是我的目标。  ...
单位岗位补助申请范文简短通用... 单位岗位补助申请范文简短 第一篇尊敬各位领导:我是联运公司994车队职工XX,86年部队转业安置到公...
特色产业补贴申请范文推荐46... 特色产业补贴申请范文 第一篇尊敬的公司领导:因酒店客房前期开荒,需要加大安全管理力度和物资搬运。现本...
试用员工转正申请表怎么写 试用员工转正申请表怎么写  转正申请书人力资源部:  我叫XX,是本公司XX部员工,自XX年X月X日...
学校申请打井报告范文优选16... 学校申请打井报告范文 第一篇今年,我县遭受特大旱灾,我处四个农业村1085亩水稻,有95%以上因缺水...
课题申请书 课题申请书模板10篇  在当今不断发展的世界,申请书在现实生活中使用广泛,写申请书的时候要注意内容的...
优秀班集体的申请书 优秀班集体的申请书范文(精选8篇)  现今社会公众的追求意识不断提升,申请书在生活中的使用越来越广泛...
减租申请书 减租申请书范文(精选6篇)  随着时代在进步,用到申请书的地方很多,我们在写申请书的时候要注意态度要...
教师人事调动申请书 尊敬的领导:您们好!我们夫妻(刘军、贾容)同为合江教育事业战线上的人民教师;现将我们的工作及生活情况...
岗位调动申请书格式及 岗位调动申请书格式及范文  员工想要进行岗位的调动,可以向公司提出申请。接下来小编整理了岗位调动申请...
公司职员转正申请书 公司职员转正申请书  一、什么是申请书  申请书是个人或集体向组织、机关、企事业单位或社会团体表述愿...
先进个人申请书 先进个人申请书范文  欢迎来到公文站,本站专门为大家整理提供各种申请书,大家可以来此查找资料,下面为...
劳动仲裁申请书格式 劳动仲裁申请书格式范文  申诉人:凯,男,汉族,1986年7月19日出生,  身份证号:  住住址:...
考研期间申请自主实习范文10... 考研期间申请自主实习范文 第一篇尊敬的院领导:我是级系专业班的学生,我已经自己联系了实习就业单位,到...
项目规划申请书 项目规划申请书(精选8篇)  在当今社会高速发展的今天我们都会用到申请书,申请书是承载我们愿望和请求...
入党申请书800字 入党申请书800字(通用7篇)  在市场经济发展迅速的今天,很多场合都离不了申请书,写申请书的时候要...
劳动人事争议仲裁申请书 劳动人事争议仲裁申请书(15篇)  在人们物质精神需求不断增长的今天,我们会使用上申请书,不同的使用...
转户口申请书模版 转户口申请书模版(精选10篇)  在这个高速发展的时代,需要使用申请的场合越来越多,正确运用申请书可...