OBB碰撞检测可直接用的C++源码和TypeScript源码以及对应3D测试演示

OBB(Oriented Bounding Box)有向包围盒。具体概念和算法网上很多,这里就不赘述了,直接上代码。

先看测试演示Demo: OBB相交检测测试演示,方便实际尝试,界面效果如下图:

 上图所用的主要源码在下面给出(代码中用到的Vecter3相关的源码很常见,这里就不给出了)。

C++源码:

template <typename NumberType>
NumberType OBB<NumberType>::AbsR[3][3]{0.0f};
template <typename NumberType>
NumberType OBB<NumberType>::R[3][3]{0.0f};

template <typename NumberType>
OBB<NumberType>::OBB() noexcept
    :
    version(-1),
    radius(0.0f),
    m_ts{0.0f},
    extents{0.0}
{
}

template <typename NumberType>
void OBB<NumberType>::update()
{
    version++;
    for (auto i = 0; i < 3; ++i) axes[i].normalize();
    auto et      = extent;
    radius = et.getLength();
    //et.toArray3(extents.data());
    et.toArray3(extents);
}
template <typename NumberType>
bool OBB<NumberType>::containsV(const Vec3<NumberType>& pv) noexcept
{
    m_pv.subVecsTo(pv, center);
    auto v0 = m_pv;

    using namespace std;

    auto& et = extent;
    return abs(v0.dot(axes[0])) <= et.x && abs(v0.dot(axes[1])) <= et.y && abs(v0.dot(axes[2])) <= et.z;
}
template <typename NumberType>
bool OBB<NumberType>::intersect(const OBB& obb, NumberType epsilon)
{
    auto& a = *this;
    auto& b = obb;

    using namespace std;

    // 计算距离向量tv
    m_pv.subVecsTo(b.center, a.center);
    auto& tv = m_pv;

    if (tv.getLength() - (a.radius + b.radius) > epsilon)
    {
        return false;
    }
    auto Avs = OBB<NumberType>::AbsR;
    auto Rvs = OBB<NumberType>::R;

    // 计算旋转矩阵R
    for (auto i = 0; i < 3; ++i)
    {
        for (auto j &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值