Respuestas:
Podrías descomponer tu cuaternión en un conjunto de ángulos de guiñada / inclinación / balanceo, pero eso suele ser excesivo.
En lugar de componer tus cuaterniones de esta manera:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
Prueba esto:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
Entonces nunca generará inclinación / balanceo y es equivalente a almacenar guiñada y cabeceo por separado
framePitch
y frameYaw
float
tipos? Además, agradecería algunas aclaraciones sobre su primera oración.
cameraOrientation
, framePitch
y frameYaw
son todos los cuaterniones (cada uno de cuaternión es de 4 flotadores o dobles).
Este es un problema que tuve durante un tiempo y no pude encontrar ninguna respuesta, así que pensé en publicarlo aquí.
En realidad es bastante simple. La forma más probable de hacer las rotaciones es la siguiente:
currentDirection * newRotation;
Pero, hacerlo así tampoco funciona.
newRotation * currentDirection;
Lo que tiene que hacer es hacerlo en el primer orden para las rotaciones hacia arriba y hacia abajo, y en el segundo orden para las rotaciones laterales.
Para mí fue así:
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
Por una razón, la primera forma tiene la rotación relativa a la dirección lateral actual, que desea para arriba y abajo, pero no para las rotaciones laterales, por lo que se necesita el segundo orden.
Para una cámara FPS, generalmente no desea rodar y está limitado a +/- 90 grados de inclinación, por lo que solo debería seguir el estado actual utilizando los ángulos de guiñada y inclinación. El pleno poder de los cuaterniones no es realmente útil para esto.
Todavía puede convertir los ángulos de guiñada / inclinación hacia y desde los cuaterniones en caso de que desee realizar la transición entre la cámara FPS y las cámaras animadas utilizando la interpolación de fotogramas clave de cuaternión, o algo así.
Otro truco simple es colocar la cámara en un GameObject y hacer que la rotación Yaw controle el objeto del juego, mientras que la cámara secundaria está configurada con las coordenadas Pitch:
playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);