OBB碰撞及四叉树优化

本文介绍了在游戏开发中如何实现OBB(有向包围盒)碰撞检测,并探讨了使用四叉树进行空间优化的方法。文章首先讲解了AABB(轴对齐包围盒)与OBB的区别,然后详细阐述了OBB的构造和相交检测,最后通过实际的C#代码展示了OBB相交的测试。此外,作者还讨论了四叉树在优化大量物体碰撞检测中的作用,以及如何实现动态四叉树更新策略,以提高游戏性能。
摘要由CSDN通过智能技术生成

项目最近在移植lua,考虑到后续会用到帧同步,就自告奋勇,尝试写一下碰撞系统,原来实现过AABB的碰撞,OBB碰撞就是在AABB的碰撞上加了个旋转,可理解为有向的AABB(AABB为轴对其,可理解为在同一坐标系中,各碰撞的正方向轴都一样),下图为AABB与OBB区别

AABB与OBB区别
刚开始做的时候把这个碰撞想的太简单,没有经过深思熟虑,直接就开始写,结果导致越写越乱,越写东西越多,写代码还是得先设计!

AABB碰撞检测

1.AABB构造:
矩形包围盒可采用:
①中心点加宽高
②者对角线两个点。(这是小学还是初中数学知识记不清了,确定一个矩形的方法)。
方便更新的话,我采用了中心点加宽高的构造,代码中物体变了位置,就改变一个position就行(AABB的center默认为position)

球形包围盒:圆心center,半径R

2.AABB相交;
①矩形与矩形相交:
在这里插入图片描述
其中min与max 都是根据AABB自身计算出的数值

②矩形与球形相交:
找到球与矩形最近的一点,最近的一点都没有相交,则不相交。这个转换需要自己想一会,刚开始我也没想明白,想明白了就好了。
 if (other.Shape == ShapeType.Sphere)
            {
   
                ColliderSphere sphere = other as ColliderSphere;

                FixPoint x = sphere.Position.x;
                FixPoint y = sphere.Position.y;
                FixPoint z = sphere.Position.z;

                if (x > MaxX) {
    x = MaxX; }
                if (x < MinX) {
    x = MinX; }

                if (y > MaxY) {
    y = MaxY; }
                if (y < MinY) {
    y = MinY; }

                if (z > MaxZ) {
    z = MaxZ; }
                if (z < MinZ) {
    z = MinZ; }

                FixPoint distance = (x - sphere.Position.x) * (x - sphere.Position.x) + 
                    (y - sphere.Position.y) * (y - sphere.Position.y) + 
                    (z - sphere.Position.z) * (z - sphere.Position.z);

                if (sphere.Radius * sphere.Radius >= distance)
                {
   
                    return true;
                }
                return false;
            }</
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值