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;
}
Exemple #2
0
inline void Camera::GetOrientation( Matrix33& matDestOrient ) const
{
	matDestOrient.SetColumn( 0, m_vRight );
	matDestOrient.SetColumn( 1, m_vUp );
	matDestOrient.SetColumn( 2, m_vFront );
}