inline Matrix33 horizontal( const Matrix33& src ) { Matrix33 dest = src; dest( 1, 1 ) = 1; dest( 0, 1 ) = 0; dest( 2, 1 ) = 0; dest( 1, 0 ) = 0; dest( 1, 2 ) = 0; dest.Orthonormalize(); return dest; }
void CRotatableTurret::Update( float dt ) { UpdateAimInfo(); Matrix34 init_world_pose = m_ParentWorldPose * m_MountLocalPose; // Why calculate on local space? // - world pose of the turret keeps changes if the owner entity keeps moving. // Vector3 vTargetDirection = m_vAimDirection; Vector3 vLocalTTableAxis = m_MountLocalPose.matOrient.GetColumn(1); // y-axis Vector3 vLocalTargetDir; init_world_pose.InvTransform( vLocalTargetDir, m_vAimDirection ); Vector3 vLocalTgtDirOnTTable = vLocalTargetDir - vLocalTTableAxis * Vec3Dot( vLocalTTableAxis, vLocalTargetDir ); Vec3Normalize( vLocalTgtDirOnTTable, vLocalTgtDirOnTTable ); Matrix33 matLocalTargetRotation; matLocalTargetRotation.SetColumn( 0, Vec3Cross( vLocalTTableAxis, vLocalTgtDirOnTTable ) ); matLocalTargetRotation.SetColumn( 1, vLocalTTableAxis ); matLocalTargetRotation.SetColumn( 2, vLocalTgtDirOnTTable ); matLocalTargetRotation.Orthonormalize(); m_LocalTurnTableOrient.target.FromRotationMatrix( matLocalTargetRotation ); // calc how much the gun tube needs to be elevated (pitch rotation) float target_pitch = Vec3GetAngleBetween( vLocalTargetDir, vLocalTgtDirOnTTable ); Limit( target_pitch, 0.0f, deg_to_rad(85.0f) ); m_LocalGunTubePitchAngle.target = target_pitch; // update critical damping m_LocalGunTubePitchAngle.Update( dt ); m_LocalTurnTableOrient.Update( dt ); // vLocalTTableRightDir = m_LocalTurnTableOrient.current.ToRotationMatrix().GetColumn(0); // update local poses Matrix34 local_mount_pose, local_gun_tube_pose; local_mount_pose = Matrix34( m_MountLocalPose.vPosition, m_LocalTurnTableOrient.current.ToRotationMatrix() ); // local_gun_tube_pose = Matrix34( m_GunLocalPose.vPosition, Matrix33RotationAxis( m_LocalGunTubePitchAngle.current, vLocalTTableRightDir ) ); local_gun_tube_pose = Matrix34( m_GunLocalPose.vPosition, Matrix33RotationAxis( m_LocalGunTubePitchAngle.current, m_GunLocalPose.matOrient.GetColumn(0) ) ); m_MountWorldPose = m_ParentWorldPose * local_mount_pose; m_GunWorldPose = m_MountWorldPose * local_gun_tube_pose; }