void CAI_Motor::SetIdealYawToTarget( const Vector &target, float noise, float offset ) { float base = CalcIdealYaw( target ); base += offset; if ( noise > 0 ) { noise *= 0.5; base += random->RandomFloat( -noise, noise ); if ( base < 0 ) base += 360; else if ( base >= 360 ) base -= 360; } SetIdealYaw( base ); }
//----------------------------------------------------------------------------- // Purpose: Determines the pose parameters for the bending of the body and tail speed // Input : moveRel - the dot products for the deviation off of each direction (f,r,u) // speed - speed of the fish //----------------------------------------------------------------------------- void CNPC_Ichthyosaur::SetPoses( Vector moveRel, float speed ) { float movePerc, moveBase; //Find out how fast we're moving in our animations boundaries if ( GetIdealActivity() == ACT_WALK ) { moveBase = 0.5f; movePerc = moveBase * ( speed / ICH_SWIM_SPEED_WALK ); } else { moveBase = 1.0f; movePerc = moveBase * ( speed / ICH_SWIM_SPEED_RUN ); } Vector tailPosition; float flSwimSpeed = movePerc; //Forward deviation if ( moveRel.x > 0 ) { flSwimSpeed *= moveBase + (( moveRel.x / m_vecAccelerationMax.x )*moveBase); } else if ( moveRel.x < 0 ) { flSwimSpeed *= moveBase - (( moveRel.x / m_vecAccelerationMin.x )*moveBase); } //Vertical deviation if ( moveRel.z > 0 ) { tailPosition[PITCH] = -90.0f * ( moveRel.z / m_vecAccelerationMax.z ); } else if ( moveRel.z < 0 ) { tailPosition[PITCH] = 90.0f * ( moveRel.z / m_vecAccelerationMin.z ); } else { tailPosition[PITCH] = 0.0f; } //Lateral deviation if ( moveRel.y > 0 ) { tailPosition[ROLL] = 25 * moveRel.y / m_vecAccelerationMax.y; tailPosition[YAW] = -1.0f * moveRel.y / m_vecAccelerationMax.y; } else if ( moveRel.y < 0 ) { tailPosition[ROLL] = -25 * moveRel.y / m_vecAccelerationMin.y; tailPosition[YAW] = moveRel.y / m_vecAccelerationMin.y; } else { tailPosition[ROLL] = 0.0f; tailPosition[YAW] = 0.0f; } //Clamp flSwimSpeed = clamp( flSwimSpeed, 0.25f, 1.0f ); tailPosition[YAW] = clamp( tailPosition[YAW], -90.0f, 90.0f ); tailPosition[PITCH] = clamp( tailPosition[PITCH], -90.0f, 90.0f ); //Blend m_flTailYaw = ( m_flTailYaw * 0.8f ) + ( tailPosition[YAW] * 0.2f ); m_flTailPitch = ( m_flTailPitch * 0.8f ) + ( tailPosition[PITCH] * 0.2f ); m_flSwimSpeed = ( m_flSwimSpeed * 0.8f ) + ( flSwimSpeed * 0.2f ); //Pose the body SetPoseParameter( 0, m_flSwimSpeed ); SetPoseParameter( 1, m_flTailYaw ); SetPoseParameter( 2, m_flTailPitch ); //FIXME: Until the sequence info is reset properly after SetPoseParameter if ( ( GetActivity() == ACT_RUN ) || ( GetActivity() == ACT_WALK ) ) { ResetSequenceInfo(); } //Face our current velocity GetMotor()->SetIdealYawAndUpdate( UTIL_AngleMod( CalcIdealYaw( GetAbsOrigin() + GetAbsVelocity() ) ), AI_KEEP_YAW_SPEED ); float pitch = 0.0f; if ( speed != 0.0f ) { pitch = -RAD2DEG( asin( GetAbsVelocity().z / speed ) ); } //FIXME: Framerate dependant QAngle angles = GetLocalAngles(); angles.x = (angles.x * 0.8f) + (pitch * 0.2f); angles.z = (angles.z * 0.9f) + (tailPosition[ROLL] * 0.1f); SetLocalAngles( angles ); }
void CAI_Motor::SetIdealYawToTargetAndUpdate( const Vector &target, float yawSpeed ) { SetIdealYawAndUpdate( CalcIdealYaw( target ), yawSpeed ); }
void CAI_Motor::SetIdealYawToTarget( const Vector &target ) { SetIdealYaw( CalcIdealYaw( target ) ); }