What I want is to keep an object always upright at it's floor. In this example, vUp should try to be as similar as Normal.

Here's my piece of code, it's not working well:
- Code: Select all
void CMKSKartMovement::CalculateAngularVelocity( void )
{
CMKSKart *mksKart = GetKart();
if( !mksKart )
return;
CMKSPlayer *mksPlayer = GetKart()->GetDriver();
if( !mksPlayer )
return;
IPhysicsObject *physKart = mksKart->VPhysicsGetObject();
if(!physKart)
return;
Vector vGroundNormal = mksKart->GetGroundNormal();
Vector vUp = mksKart->GetUp();
float dotprod = DotProduct( vUp, vGroundNormal );
if(dotprod > 1.0f)
dotprod = 1.0f;
float angle = RAD2DEG(acos(dotprod));
AngularImpulse angVelocity;
angVelocity = vGroundNormal - vUp;
angVelocity.NormalizeInPlace();
angVelocity *= angle;
mksKart->SetAngularVelocity( angVelocity );
}



