Ir al contenido principal

Vista en tercera persona

Luego de un poco de trabajo logré implementarlo correctamente. La solución que usé no es la óptima, pero es que mis conocimientos de geometría y álgebra no daban para más. Un amigo me recomendó que usara matrices, pero hasta allá no llego por ahora. Creo que debería haber una solución que no implique el uso de dos ángulos. Si por casualidad algún matemático pasa por aquí y lee esto, por favor que deje sus sugerencias para optimizar. Ahora lamento profundamente haberme dormido en el aula.


Esto es puro teorema de Pitágoras. Hay que partir de que en cada paso, en cualquier dirección, el personaje se moverá una distancia de S puntos y la cámara estará ubicada C puntos detrás. El personaje se desplaza en X y Z (obviaremos Y por ahora, que es la altura). Si sabemos S y el ángulo alfa, podemos determinar a y b, lo mismo para la cámara, que rota alrededor de la posición del personaje, siempre apuntando a su espalda.
cam_x = C * cos(beta)
cam_z = C * sen(beta)
player_x = S * cos(alfa)
player_y = S * sen(alfa)
En el programa como tal solo tenemos que inicializar los ángulos del personaje y la cámara: alfa=90, beta=90, y de acuerdo a la tecla presionada incrementamos alfa y decrementamos beta, o viceversa, teniendo en cuenta siempre que hay que dar la vuelta en 0 o 360.

Si alguien siente curiosidad, el gráfico está hecho con gimp. Hacer alfa y beta implicó un proceso algo curioso, la primera está hecha a partir de un 8 al que roté y borré un pedazo. Beta es el mismo 8, al que le borré un pedazo y le dibujé una línea.

Comentarios

  1. ¿y si hay un objeto detras del personaje?
    supongo que ese c es variable o algo así, ¿no?

    yo es que no entiendo nada de eso, pero bueno, queria saber que haces con las paredes...

    ResponderEliminar
  2. Por supuesto, C es variable. El mecanismo habitual en este tipo de vista para lidiar con los objetos detrás del personaje es acercar la cámara lo suficiente como para que el obstáculo no interfiera con la vista.
    Pero eso es un tema que por ahora escapa de mis posibilidades. Supongo que involucre detección de colisiones.

    ResponderEliminar

Publicar un comentario