/*@brief Return the cross product of two vectors */ public static void btCross( ref btVector3 v1, ref btVector3 v2, out btVector3 result ) { v1.cross( ref v2, out result ); }
/// Solve A * x = b, where b is a column vector. This is more efficient /// than computing the inverse in one-shot cases. ///Solve33 is from Box2d, thanks to Erin Catto, public void solve33( ref btVector3 b, out btVector3 result ) { btVector3 col1 = getColumn( 0 ); btVector3 col2 = getColumn( 1 ); btVector3 col3 = getColumn( 2 ); btVector3 tmp; col2.cross( ref col3, out tmp ); float det = col1.dot( ref tmp ); if( btScalar.btFabs( det ) > btScalar.SIMD_EPSILON ) { det = 1.0f / det; } col2.cross( ref col3, out tmp ); result.x = det * b.dot( ref tmp ); b.cross( ref col3, out tmp ); result.y = det * col1.dot( ref tmp ); col2.cross( ref b, out tmp ); result.z = det * col1.dot( ref tmp ); result.w = 0; }
/*@brief Return a rotated version of this vector @param wAxis The axis to rotate about @param angle The angle to rotate by */ public void rotate( ref btVector3 wAxis, float angle, out btVector3 result ) { btVector3 o; wAxis.Mult( wAxis.dot( ref this ), out o ); btVector3 _x; this.Sub( ref o, out _x ); btVector3 _y; wAxis.cross( ref this, out _y ); btVector3 tmp; btVector3 tmp2; _x.Mult( btScalar.btCos( angle ), out tmp ); o.Add( ref tmp, out tmp2 ); _y.Mult( btScalar.btSin( angle ), out tmp ); tmp2.Add( ref tmp, out result ); }