btRigidBody* Physics::CreateRigidBody( const float mass, const CIwFVec3 position, const CIwFVec3 rotation, btCollisionShape* shape ) { btRigidBody* rigidBody; btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin( btVector3( position.x, position.y, position.z ) ); btQuaternion q; CIwFVec3 rot = rotation * static_cast<float>( BPU_PI_180 ); EulerXYZToQuaternion( rot, q ); startTransform.setRotation( q ); bool isDynamic = ( mass != 0.f ); // Rigidbody is dynamic if and only if mass is non zero, otherwise static btVector3 localInertia( 0, 0, 0 ); if( isDynamic ) { shape->calculateLocalInertia( mass, localInertia ); } // Using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects #ifdef USE_MOTIONSTATE btDefaultMotionState* motionState = new btDefaultMotionState( startTransform ); btRigidBody::btRigidBodyConstructionInfo rInfo( mass, motionState, shape, localInertia ); rigidBody = new btRigidBody( rInfo ); #else rigidBody = new btRigidBody( mass, 0, shape, localInertia ); rigidBody->setWorldTransform( startTransform ); #endif m_dynamicsWorld->addRigidBody( rigidBody ); return rigidBody; }
//------------------------------------------------------------------------------ //! setRotation //! Set animator rotation (v measured in radians) void CBulletObjectAnimator::setRotation(const core::vector3df& v) const { _IRR_DEBUG_BREAK_IF(rigidBody == NULL); btTransform t = rigidBody->getWorldTransform(); btQuaternion btq; EulerXYZToQuaternion(v, btq); t.setRotation(btq); rigidBody->setWorldTransform(t); }