Поэтому я пытаюсь сделать так, чтобы сфера правильно сталкивалась с 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;
}
Это просто догадка … вы не указали, на какой именно платформе и компиляторе вы это тестируете, но если функция pow () реализована наивно, она может дать сбой при отрицательных значениях первого аргумента.
Согласно спецификации, он должен работать правильно для отрицательных значений базы, пока показатель степени является целым числом. Но наивно реализованный универсальный pow (base, exponent) может делать что-то вроде exp (e, ln (base) * exponent)), и это будет возвращать NaN для отрицательных значений base.
Который будет иметь именно тот эффект, который вы описываете — он будет работать только на той стороне, где все три оси генерируют положительные дельты в вашем примере кода.
В любом случае всегда безопаснее выполнить возведение в квадрат вручную или реализовать встроенный метод:
float square(float a) { return a*a; }
для более чистого кода.
Других решений пока нет …