Rotar padre para hacer que el hijo mire en dirección contraria al frente del objetivo.
Escenario:
– El padre P1 tiene el hijo C1
– El objetivo existe
– Todos los vectores directores de los objetos se enfrentan perfectamente paralelos al plano X-Z (pseudo 2D)
– Las posiciones de todos los objetos son arbitrarias
– El hijo nunca se moverá por sí solo dentro del espacio del padre
Objetivo:
Rotar exclusivamente a P1 alrededor del eje Y para que C1 enfrente en la dirección opuesta al vector director del objetivo
Nota: El eje Y positivo se dirige hacia el lector, el negativo se dirige hacia adentro de la pantalla
Implementación:
c#
P1.rotation = Quaternion.LookRotation(-target.forward) * Quaternion.Euler(0, -C1.localEulerAngles.y, 0);
Lo anterior parece funcionar la mayoría de las veces, pero a veces falla al azar y a veces genera un vector cero como hacia adelante. No tengo experiencia con ángulos de Euler y cuaterniones, así que mis disculpas de antemano.
davy.ai
Solución
Para rotar the Parent P1 exclusivamente alrededor del eje Y de manera que C1 mire en dirección opuesta al vector hacia el objetivo, necesitamos:
Para implementar esto en código, podemos utilizar el método
Quaternion.LookRotation
para encontrar la dirección desde C1 hasta el objetivo, y luego utilizar la función del producto punto para calcular el ángulo entre esa dirección y el vector hacia adelante de C1. El ángulo resultante se puede utilizar para crear un nuevo quaternion que rote P1 alrededor del eje Y.“`c#
// Encontrar la dirección desde C1 hasta el objetivo
Vector3 targetDir = target.position – C1.position;
// Calcular el ángulo entre esa dirección y el vector hacia adelante de C1
float angle = Mathf.Atan2(targetDir.x, targetDir.z) * Mathf.Rad2Deg – C1.localEulerAngles.y;
// Rotar P1 alrededor del eje Y
P1.rotation = Quaternion.Euler(0, angle, 0);
“`
Al utilizar este método, podemos asegurarnos de que P1 siempre se rote correctamente, independientemente de las posiciones arbitrarias de los objetos o de la rotación del espacio local del Parent.