Tengo dos objetos (objetivo y jugador), ambos tienen Posición (Vector3) y Rotación (Quaternion). Quiero que el objetivo gire y esté de frente al jugador. El objetivo, cuando dispara algo, debe disparar directamente al jugador.
He visto muchos ejemplos de slerping para el jugador, pero no quiero una rotación incremental, bueno, supongo que eso estaría bien siempre que pueda hacer que el slerp sea 100%, y mientras realmente funcione.
FYI: soy capaz de usar la posición y la rotación para hacer muchas otras cosas y todo funciona muy bien, excepto esta última pieza que no puedo entender.
Las muestras de código se ejecutan en la clase del Objetivo, Posición = la posición del objetivo, Avatar = el jugador
EDITAR
¡Ahora estoy usando el código C # de Maik que me ha proporcionado y funciona muy bien!
0*(rotation A) + 1*(rotation B)
, en otras palabras, solo está configurando la rotación en la rotación B a lo largo. Slerp es solo para determinar cómo debería verse la rotación (0% <x <100%) del camino intermedio.Respuestas:
Hay más de una forma de hacerlo. Puede calcular la orientación absoluta o la rotación relativa a su avatar, eso significa que su nueva orientación = avatarOrientation * q. Aquí está el último:
Calcule el eje de rotación tomando el producto cruzado del vector de unidad de avance de su avatar y el vector de unidad de avatar a destino, el nuevo vector de avance:
Calcule el ángulo de rotación usando el producto punto
Crea el cuaternión usando rotAxis y rotAngle y multiplícalo con la orientación actual del avatar
Si necesita ayuda para encontrar el vector de avance actual del avatar, la entrada para 1. simplemente dispare :)
EDITAR: Calcular la orientación absoluta es en realidad un poco más fácil, use el vector directo de la matriz de identidad en lugar del vector directo de avatares como entrada para 1) y 2). Y no lo multiplique en 3), en su lugar, úselo directamente como la nueva orientación:
newRot = q
Importante tener en cuenta: la solución tiene 2 anomalías causadas por la naturaleza del producto cruzado:
Si los vectores directos son iguales. La solución aquí es simplemente devolver la identidad quaternion
Si los vectores apuntan exactamente en la dirección opuesta. La solución aquí es crear el cuaternión mediante el uso de avatares en el eje hacia arriba como eje de rotación y el ángulo de 180.0 grados.
Aquí está la implementación en C ++ que se ocupa de esos casos extremos. Convertirlo a C # debería ser fácil.
EDITAR: versión corregida del código XNA de Marc
fuente
newForward
rotAngle
rotAxis
y elreturned quaternion
. El código para la mafia será el mismo, una vez que lo hagamos funcionar con el avatar, será fácil cambiar el encabezado de cualquier objeto.