2017-11-20 34 views
0

これで、球がAABBと正しく衝突するようにしようとしています。しかし何らかの理由でAABBの片側でしか起こらないでしょう。他のすべての側面は、衝突がないかのように動作します。AABB intersect BoundingSphereは片面でしか動作しません

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

これは単なる勘です...あなたはこれを上のテストしているかを正確にプラットフォームとコンパイラ指定されていませんでしたが、POW()関数は単純に実装されている場合、それが負の値のために失敗する可能性があります最初の議論。 According to the specsの場合、指数が整数である限り、負の値のbaseに対して正しく動作するはずです。しかし、純粋に実装された汎用のpow(base、exponent)は、exp(e、ln(base)* exponent)のようなものを実行する可能性があり、baseの負の値に対してNaNを返します。それだけですべての3つの軸は、あなたのコード例では正のデルタを生成する側に働くだろう - あなたが記述正確な効果を持っているでしょう

。いずれの場合においても

、手動で乗を行う、などのインライン実装することは常に安全です:クリーンなコードのための float square(float a) { return a*a; } を。

関連する問題