Rotación de una cámara en tercera persona hacia un objetivo

10

Tengo una cámara en tercera persona que no mira directamente al jugador, sino en algún lugar frente a él.

Cuando el usuario ingresa al modo de disparo, quiero que la cámara dé la vuelta al jugador para mirar al objetivo.

ejemplo de lo que estoy hablando

En la imagen de arriba. "O" es el jugador (Origen), "L" es el lookat, "C" es la posición de la cámara y "T" es el objetivo. Quiero rotar la línea de búsqueda C-> L para que pase por T (C '-> L' -> T ') alrededor del Origen ("O").

Básicamente necesito encontrar el ángulo alfa que puse en rojo en la imagen.

Almaceno la posición de mi cámara en una estructura como esta:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Entonces, si pudiera encontrar el ángulo que estoy buscando, podría hacer algo como:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Para que el jugador mire siempre al objetivo.

Si el lookat pasara por Origin, simplemente podría hacer

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

Sin embargo, en el diagrama anterior, esto no funciona del todo, ya que la rotación está desviada del origen.

Matchoc
fuente

Respuestas:

1

Respondiéndome a mí mismo si algún día ayuda a alguien más:

SFDKT tiene la idea correcta de proyectar el punto de destino en la dirección de mirada de la cámara actual.

Sin embargo, mi mayor problema fue encontrar este punto P. Resultó que un poco de trigonometría logró resolverlo.

Considerando el triángulo formado por los tres puntos CPO:

  1. Como sé las longitudes LO, OC y CL, puedo calcular el ángulo en C.

  2. Ahora sé el ángulo C y la longitud de OC y PO. Usando la ley de los senos, puede encontrar el ángulo en O. ( Este sitio web me pareció muy útil para encontrar los ángulos faltantes)

  3. Luego puedo encontrar el último ángulo faltante P y usar nuevamente la ley de los senos para encontrar la longitud CP.

  4. Tome la dirección de mirada posC + normalizado (CL) * lengthCP me da la posición de P.

  5. Una vez que tengo PI puedo calcular la rotación más corta entre OP y OT, lo que me da el cuaternión que necesito para rotar mi cámara.

Tuve algunos problemas con el rollo no deseado en 3D, pero resolví el problema con Z = 0 y luego calculé la rotación de tono faltante para mantener el vector recto de la cámara.

Matchoc
fuente
0

Esta imagen agrega la simetría necesaria para resolver la pregunta más fácilmente.

ingrese la descripción de la imagen aquí

Solo proyecta a lo Llargo del vector CLpara que |P-O|=|T-O|.

Ahora, obviamente, son solo dos triángulos idénticos ( CPOy C'TO) rotados por el ángulo deseado. ES DECIRang(OT)-ang(OP)

C'y L'son a la vez iguales Cy Lposteriores a la rotación, aproximadamente O, en la misma cantidad.

DSWFB
fuente