AABB与BoundingSphere相交仅在一侧工作

时间:2017-11-20 21:33:26

标签: c++ 3d collision aabb

所以我试图让它变成一个球体正确地与AABB碰撞。但出于某种原因,它只会发生在AABB的一侧。所有其他方面都表现得好像没有碰撞。

    float  dmin;
    float  r2 = pow(m_Radius, 2);
    dmin = 0;

    if (m_Center.GetX() < other.GetMinExtents().GetX())
        dmin += pow(m_Center.GetX() - other.GetMinExtents().GetX(), 2);
    else if (m_Center.GetX() > other.GetMaxExtents().GetX())
        dmin += pow(m_Center.GetX() - other.GetMaxExtents().GetX(), 2);

    if (m_Center.GetY() < other.GetMinExtents().GetY())
        dmin += pow(m_Center.GetY() - other.GetMinExtents().GetY(), 2);
    else if (m_Center.GetY() > other.GetMaxExtents().GetY())
        dmin += pow(m_Center.GetY() - other.GetMaxExtents().GetY(), 2);

    if (m_Center.GetZ() < other.GetMinExtents().GetZ())
        dmin += pow(m_Center.GetZ() - other.GetMinExtents().GetZ(), 2);
    else if (m_Center.GetZ() > other.GetMaxExtents().GetZ())
        dmin += pow(m_Center.GetZ() - other.GetMaxExtents().GetZ(), 2);

    if (dmin < r2)
    {
        return true;
    }

1 个答案:

答案 0 :(得分:0)

这只是一个预感......你没有具体说明你正在测试它的平台和编译器,但是如果pow()函数是天真地实现的,那么第一个参数的负值可能会失败。 According to the specs,只要指数是整数,它就可以正确地用于base的负值。但天真实现的通用pow(base,exponent)可能会执行类似exp(e,ln(base)* exponent))的操作,并且会返回NaN作为base的负值。

这将完全具有您描述的效果 - 它仅适用于所有三个轴在示例代码中生成正增量的一侧。

在任何情况下,手动进行平方操作总是更安全,或者实现内联方式: float square(float a) { return a*a; } 更清洁的代码。