Unity Bound

Bound:包围盒,边界框,AABB的简称,Mesh,Collider,Renderer都存在bound。(Mesh返回的是自身坐标,其余返回的是世界坐标)。


using UnityEngine;
using System.Collections;
using System.Xml;

public class TestXml : MonoBehaviour {

    public GameObject Target;

    public GameObject Target2;

    Bounds bounds;

    void Start()
    {
        bounds = Target.GetComponent<BoxCollider>().bounds;

        Debug.Log("center:" + bounds.center);//中点
        Debug.Log("Size:" + bounds.size);//bound的大小,等于extents*2
        Debug.Log("Min:" + bounds.min);//bound上最小的点,总是等于center-extents
        Debug.Log("Max:" + bounds.max);//bound上最大的点,总是等于center+extents
        Debug.Log("extents:" + bounds.extents);//圣典上翻译成广度,笔者也不清楚如何理解,它等于size/2

        //传入一个点,找离bounds最近的点,如果点在bounds上,则返回输入的点
        Debug.Log(bounds.ClosestPoint(bounds.center));
        Debug.Log(bounds.ClosestPoint(bounds.min));
        Debug.Log(bounds.ClosestPoint(Vector3.zero));

        //判断点是否在bounds上
        Debug.Log(bounds.Contains(bounds.center));
        Debug.Log(bounds.Contains(bounds.min));
        Debug.Log(bounds.Contains(Vector3.zero));

        Bounds temp = new Bounds(Vector3.zero, Vector3.one * 3);

        bounds.Encapsulate(Vector3.one);//使bound包含这个点

        bounds.Encapsulate(temp);//使bound包含参数bound

        bounds.Expand(Vector3.one * 2);//扩大包围盒

        bounds.SetMinMax(Vector3.zero, Vector3.zero);//设置最大最小点,且比单独设置min,max效率要高

        Debug.Log(bounds.Intersects(temp));//是否与参数包围盒相交

        Debug.Log(bounds.SqrDistance(Vector3.up * 2));//返回一个参数点与bound最近的距离平方;
    }

    bool DetectHit(Ray ray)
    {   
       //判断射线是否在bound上
        return bounds.IntersectRay(ray);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (DetectHit(ray))
            {
                Debug.Log("点中包围盒");
            }
            else {
                Debug.Log("没有点中");
            }
        }
    }
}


转载请注明出处:Mr_Jis的博客

### Unity 中八叉树的实现与应用 #### 八叉树的基本概念 八叉树是一种用于三维空间划分的数据结构,通过递归地将空间划分为八个子区域来表示复杂的空间分布。这种数据结构常被用来优化碰撞检测、可见性计算以及大规模场景管理等问题。 在 Unity 的开发环境中,八叉树可以显著提升性能效率,尤其是在处理大量游戏对象时。其核心思想是利用边界框(Bounds 或 AABB)定义一个初始的大立方体区域,并逐步将其细分成更小的子立方体,直到达到预设条件为止[^1]。 #### 统一初始化过程 为了构建有效的八叉树,在 Unity 场景中通常会先创建一个覆盖整个目标范围的最大 Bounds 区域作为根节点。随后按照一定规则对该区域进行细分操作: - **切割逻辑**:每次都将当前父级节点对应的立方体均匀切分成为边长相等的八个部分; - **停止准则**:当某个特定条件下不再继续分裂时结束递归流程,比如最大层数限制或者最小物体数量阈值达成等情况; 这些原则有助于控制最终形成的层次深度并减少不必要的资源消耗[^2]。 #### 应用实例分析 ##### 1. 碰撞检测优化 在一个密集填充着多个刚体模型的游戏世界里,如果采用传统的逐一对比方法来进行物理交互判断,则随着实体数目增加而呈指数增长的时间成本将会变得难以承受。然而借助于预先建立起来的八叉索引体系之后,我们只需要关注那些真正可能相互影响的小范围内的成员即可完成快速筛选工作。 ```csharp // 假设有两个物体需要测试是否发生接触事件 if (octreeNode.IsIntersecting(objectA, objectB)) { Debug.Log("Collision detected!"); } ``` 上述伪代码片段展示了如何调用已有的八叉树节点函数去高效评估两者之间是否存在潜在冲突关系。 ##### 2. 可见性裁剪技术 对于远距离视锥外的对象不必渲染绘制出来这一常识性的做法同样适用于基于八叉组织形式下的隐藏面消除策略之中。通过对摄像机视角方向上的各级分支逐一排查剔除掉不可达的部分从而降低GPU负载压力。 ```csharp foreach(var node in visibleNodes){ if(!Camera.main.FrustumCull(node.Bound)){ continue; } RenderObjectsInNode(node); } ``` 这里列举了一个循环迭代所有可视范围内符合条件的叶子结点集合的例子,并且只针对其中未超出屏幕界限之外的内容安排进一步的具体表现动作。 #### 总结说明 综上所述,Unity 平台下运用八叉树算法不仅可以极大地改善大型项目的运行流畅度而且还能简化许多复杂的几何运算任务。不过值得注意的是实际项目部署过程中还需要综合考虑诸如内存占用率等因素的影响以便做出合理取舍调整参数配置获得最佳效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值