正規化を行う関数に、零ベクトルを渡しました。
assertion "bNormalizationResult" failed in ../../include\ode/odemath.h:326
これはdIASSERTマクロによって表示されます。
define dIASSERT( a ) if( !( a ) ) dDebug( d_ERR_IASSERT, \ "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__ );
引数aが0であった場合に、dDebug()関数が実行されます。
void dDebug ( int num, const char *msg, ... );
引数numは次の列挙の値を取ります。
/* error numbers */ enum { d_ERR_UNKNOWN = 0, /* unknown error */ d_ERR_IASSERT, /* internal assertion failed */ d_ERR_UASSERT, /* user assertion failed */ d_ERR_LCP /* user assertion failed */ };
dIASSERTマクロは、_dNormalize3()と_dNormalize4()関数内で使用されています。これらの関数はdNormalize3()とdNormalize4()の、ライブラリ内部から呼び出されるバージョンです。
// For internal use
#define dNormalize3(a) _dNormalize3(a)
#define dNormalize4(a) _dNormalize4(a)
_dNormalize3()は、
static __inline void _dNormalize3( dVector3 a ) { int bNormalizationResult = _dSafeNormalize3( a ); dIASSERT( bNormalizationResult ); dVARIABLEUSED( bNormalizationResult ); }
のように実装されています。
これらの関数内の_dSafeNormalize3()と_dSafeNormalize4()は、引数のベクトルaが零ベクトルであった場合に0を返します。そしてその0が、dIASSERTに渡されることになります。
よって前述のエラーは、正規化の関数であるdNormalize3()かdNormalize4()に、零ベクトルを渡したことが原因です。これはシミュレーションのステップサイズを小さくすることによって解決できることがあります。
スペースがロックされているときに、その内部のジオメトリを操作しようとしています。
invalid operation for locked space (..\..\ode\src\collision_space.cpp:61)
これはCHECK_NOT_LOCKEDマクロによって表示されます。
#define CHECK_NOT_LOCKED( space ) \ dUASSERT( !( space && space->lock_count ), \ "invalid operation for geom in locked space" );
lock_countはdxSpace構造体のメンバで、スペースをロックする関数の現在の処理数です。
collide()やcollide2()のような関数に入った直後にカウントアップされ、関数を抜ける直前にカウントダウンされます。
質量に無効な値を設定しようとしています。
たとえば0以下の質量は、無効な値とされます。
質量のチェックはdMassSetParameters()やdMassSetSphereTotal()のようなdMass構造体を設定する関数の他、ボディに質量を設定するdBodySetMass()でも行われます。
dBodySetMass()で設定する質量の重心が、原点にありません。
オブジェクトに過大な力が加えられた状態で、他のオブジェクトに衝突させられています。これを解決するにはオブジェクトの質量を減少させるか、シミュレーションのステップを変更します。I get "ODE Message 3: LCP internal error, s <= 0 (s=0.0000e+00)" - ODE Wiki
ジョイント グループの破棄をせずに、シミュレーションを終了させようとしています。