所以我试图让它变成一个球体正确地与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;
}
答案 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; }
更清洁的代码。