美文网首页
3d开发之AABB包围盒

3d开发之AABB包围盒

作者: 美雨知春 | 来源:发表于2020-12-27 17:33 被阅读0次

游戏开发中经常有碰撞检测,AABB包围盒就是一种很好的简化碰撞的策略

1.aabb包围盒由一个max坐标和一个min坐标组成。可以看成一个点集。

下面这段代码是关于两个包围盒碰撞的检测

    bool cheTouch(const AABB& aabb1, const AABB& aabb2)

    {

        if (aabb1.m_min.x <= aabb2.m_max.x && aabb1.m_min.y <= aabb2.m_max.y && aabb1.m_min.z <= aabb2.m_max.z && //

            aabb1.m_max.x >= aabb2.m_min.x && aabb1.m_max.y >= aabb2.m_min.y && aabb1.m_max.z >= aabb2.m_min.z)

        {

            return true;

        }

        else

        {

            return false;

        }

    }

2.关于aabb的生成

圆形很好弄,三角形和长方形比较类似,这里列出我代码中box类的aabb生成函数

一点注释:m_world是box类的四行三列的矩阵,前三行是旋转的,后一行trans表示box中心的坐标

    void Box::updateAABB()

    {

        Vec half_diag( //

            Math::abs(m_world.x_axis.x) * m_half_size.x + Math::abs(m_world.y_axis.x) * m_half_size.y + Math::abs(m_world.z_axis.x) * m_half_size.z, //

            Math::abs(m_world.x_axis.y) * m_half_size.x + Math::abs(m_world.y_axis.y) * m_half_size.y + Math::abs(m_world.z_axis.y) * m_half_size.z, //

            Math::abs(m_world.x_axis.z) * m_half_size.x + Math::abs(m_world.y_axis.z) * m_half_size.y + Math::abs(m_world.z_axis.z) * m_half_size.z);

        m_aabb.setBound(m_world.trans - half_diag, m_world.trans + half_diag);

    }

咋一看可能有些理解难度,可是如果把Math::abs这个去掉,你会惊奇的发现这个就是一个向量的旋转变换

这样,加上了Math::abs,其实也很简单,画画图就知道了

相关文章

网友评论

      本文标题:3d开发之AABB包围盒

      本文链接:https://www.haomeiwen.com/subject/csgonktx.html