¿Cuál es la forma más fácil de implementar una cámara en tercera persona en C ++ / DirectX9?

8

Soy bastante nuevo en C ++ y DirectX9 y quiero implementar una cámara en tercera persona. Después de leer un poco sobre las cámaras basadas en Quaternion, decidí intentar implementarlo. Pero realmente me sorprende, así que pregunto aquí cuál es la forma más fácil de implementar una cámara TP.

Estas son las cosas que debe hacer la cámara:

  • Siga las coordenadas almacenadas en un 3DVector (x, y, z)

  • Rotar alrededor del objeto (suave)

  • Tal vez algún tipo de 'resorte' = retroceder lentamente a la posición normal detrás del objeto después de rotar

Pide disculpas por mi mal inglés: ¡soy alemán y todavía estoy en la escuela!

¡Gracias por adelantado!

EDITAR:

Después de intentarlo, lo tengo.

El mayor problema que consideré fue la extracción correcta del Vector de "dirección" de la Matriz Mundial.

Durante mi investigación, he encontrado principalmente algo como esto:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

¡Eso NO funciona para mí! En cambio hice esto:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Para escalar:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Configuración de las posiciones:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

Para las rotaciones, debe crear una matriz mundial temporal (desde la posición del objetivo) y rotarla como desee y extraer la dirección.

¡El suavizado de la rotación realmente depende de TU juego!

¡Este tipo de cámara en tercera persona es realmente fácil de hacer y hace su trabajo!

¡Realmente GENIAL gracias a "jheriko" que me dio la respuesta correcta!

Anónimo Anónimo
fuente
+1 para describir realmente lo que necesita, eso es raro (aunque podría ser más detallado, por ejemplo, el tercer punto es confuso, ¿no estaba insinuando que está girando libremente?).
wondra
Sí, debe rotar libremente, ¡pero quiero que vuelva lentamente al Punto en la parte posterior del jugador después de que se haya completado la Rotación!
Anónimo Anónimo

Respuestas:

1

Lo que le ayudará es tener la matriz de transformación para el objeto que desea seguir. Puede extraer el vector hacia adelante de esta matriz; dependiendo de su sistema de coordenadas y de la disposición de la matriz, esta será una de las filas o columnas con el cuarto componente eliminado (suponiendo que use matrices de transformación 4x4, sin factores de escala, los factores de escala son horribles para muchas razones ... pero si tiene factores de escala, puede normalizar la fila / columna después de eliminar el cuarto componente).

Una vez que tenga esto, puede colocar la cámara directamente detrás del objeto restando esto de la posición del objeto. Para mover la cámara hacia adentro y hacia afuera, puede escalar el vector, y para rotar alrededor del objeto, puede hacer una rotación xey (o xz / zy, etc., según la mano, etc.) que aplica a una copia de la matriz de objetos. antes de extraer la dirección hacia adelante.

Finalmente, para suavizar el movimiento, la solución más simple es rastrear el desplazamiento y los ángulos anteriores y avanzar hacia ellos en una cantidad dependiente de la velocidad de fotogramas descrita por a ^ (b.dt) donde dt es el tiempo delta y a, b son parámetros que usted elige. a = 0.9 y b = 30 le da el efecto de moverse 90% hacia la posición como si lo estuviera haciendo cada cuadro a 30 fps. Esto se llama filtro de 'respuesta de impulso infinito' y es un truco clásico para este tipo de suavizado.

Esto puede no ser ideal, es posible que desee elegir una distancia mínima y restringir los ángulos también, de lo contrario, la cámara puede pasar a través del objeto. si estás dentro de un mundo denso, recortar o desvanecer objetos que intervienen también será importante.

lo siento, esto es largo, pero no es un problema trivial, como parece haber descubierto.

espero que esto ayude. Puedo proporcionar más profundidad de detalle si es necesario.

(ps no se necesitan cuaterniones, realmente no ayudan para este problema)

jheriko
fuente
¡Muchas gracias! Me diste algunas ideas de cómo hacer esto. Pero agradecería algunos ejemplos de Código, si no le importa. ¿Y por qué no usar cuaterniones? Leí que se usan comúnmente para hacer este tipo de cosas ( en.wikipedia.org/wiki/Quaternion ).
Anónimo Anónimo
Intenté hacerlo como lo describiste, pero aún tengo algunos problemas. La cámara no está en la parte posterior del jugador, sino al menos en algún lado de él. No entiendo la parte con las rotaciones X e Y: ¿Qué se debe rotar? ¿La matriz mundial, el vector de dirección o una copia del vector de posición del jugador? ¿Y cómo rotar? ¡Espero que me pueda ayudar!
Anónimo Anónimo
gira el vector de dirección, o la matriz de la que lo extrae (la matriz de transformación del objeto, no el mundo o la matriz de vista) para girar, construye matrices de rotación de ángulo de eje y las multiplica, o usa trigonometría ...
jheriko