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);
}