Wizzie/PawnLeggsRotation
This is the code I use for rotating the legs of the pawn in the same direction as it moves. It's somewhat experimental and is in need of a major overhaul, but it works for now.
class pPawn extends xPawn; enum E_LEGSSTATE { E_LEGSSTRAFING, E_LEGSFORWARD, E_LEGSBACKWARD }; var name PelvisBone; var name SpineBone; var E_LEGSSTATE LegsAnimSet; var E_LEGSSTATE LegsLastAnimSet; var int LegsActuallRollAngle; var int LegsRollAngle; var int LegsRotationSpeed; ... ... ... simulated function Tick(float DeltaTime) { ... ... ... SetAnimationDirection( DeltaTime ); } simulated function SetAnimationDirection( float DeltaTime ) { local float tY, tX; local rotator r1, r2; local vector X,Y,Z, Dir; if( Velocity.x != 0 || Velocity.y != 0 ) { GetAxes( Rotation, X,Y,Z ); Dir = Normal(Velocity); tX = X dot Dir; tY = Y dot Dir; // The rotator values for the legs requires a bit of tweeking if( tX < 0.1 && tX > -0.1 ) // only strafing { LegsRollAngle = 0; LegsAnimSet = E_LEGSSTRAFING; } else if( tX >= -0.01 ) // walking forward { if( tY > 0 ) LegsRollAngle = 8000 * -tY; else LegsRollAngle = 12000 * -tY; LegsAnimSet = E_LEGSFORWARD; } else // backwards { if( tY > 0 ) LegsRollAngle = 12000 * tY; else LegsRollAngle = 8000 * tY; LegsAnimSet = E_LEGSBACKWARD; } if( LegsAnimSet != LegsLastAnimSet ) { switch( LegsAnimSet ) { case E_LEGSSTRAFING: MovementAnims[2]='RunL'; MovementAnims[3]='RunR'; WalkAnims[2]='WalkL'; WalkAnims[3]='WalkR'; CrouchAnims[2]='CrouchL'; CrouchAnims[3]='CrouchR'; break; case E_LEGSFORWARD: MovementAnims[2]='RunF'; MovementAnims[3]='RunF'; WalkAnims[2]='WalkF'; WalkAnims[3]='WalkF'; CrouchAnims[2]='CrouchF'; CrouchAnims[3]='CrouchF'; break; case E_LEGSBACKWARD: MovementAnims[2]='RunB'; MovementAnims[3]='RunB'; WalkAnims[2]='WalkB'; WalkAnims[3]='WalkB'; CrouchAnims[2]='CrouchB'; CrouchAnims[3]='CrouchB'; break; } LegsLastAnimSet = LegsAnimSet; } } else // no movement, turn legs back to initial position over time { LegsRollAngle = 0; } if( LegsActuallRollAngle != LegsRollAngle ) { if( LegsRollAngle > LegsActuallRollAngle ) { LegsActuallRollAngle += (LegsRotationSpeed*DeltaTime); if( LegsActuallRollAngle >= LegsRollAngle ) LegsActuallRollAngle = LegsRollAngle; } else { LegsActuallRollAngle -= (LegsRotationSpeed*DeltaTime); if( LegsActuallRollAngle <= LegsRollAngle ) LegsActuallRollAngle = LegsRollAngle; } r1.roll = LegsActuallRollAngle; r1.yaw = 0; r1.pitch = 0; r2.roll = -r1.roll; r2.yaw = 0; r2.pitch = 0; SetBoneRotation( PelvisBone, r2 ); // this will rotate the entire pawn SetBoneRotation( SpineBone, r1 ); // rotate the upper body back to original position } } defaultproperties { ... ... ... PelvisBone = "Bip01 Pelvis" SpineBone = "Bip01 Spine" LegsRotationSpeed = 80000 }
GRAF1K: Um... unless you're rotating pantyhose, it's legs, not leggs.
wizzie: Sorry for spelling errors, english isn't my first language. Corrected the leggs thingy on the page but can't rename the page itself. Moved comments down below aswell. Feel free to correct any other errors or improvements
GRAF1K: It really doesn't matter... It's your own page. Just thought it was funny.