Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con cámara 3d: Caminando por un mini planeta

Iniciado por Alvaro (Garred), 23 de Diciembre de 2009, 03:16:30 AM

« anterior - próximo »

Alvaro (Garred)

Buenas. Estoy retomando la programación en 3d y se me ocurrió hacer un miniproyecto para ir calentando, pero ahora he visto que lo que tenía pensado escapa a mis conocimientos.

La idea es una cámara en primera persona que se mueva por un planeta chiquitín. Nada más. Quiero que el jugador se pueda desplazar libremente por el planeta. ¿El problema? Los puñeteros ángulos de la cámara.

¿Cómo hago para que la cámara, al desplazarse por el planeta, tenga el ángulo correcto? Es decir, que desde la perspectiva de la cámara, el suelo siempre esté abajo y el cielo arriba. Gráficamente este es el problema:



El eje de coordenadas pequeño de debajo a la derecha son las coordenadas globales. La flecha roja es el eje X, la verde es el Y, y la azul el Z. Los otros tres ejes de coordenadas son de una hipotética cámara desplazandose por el planeta. El eje verde (Y) es hacia donde mira la cámara, y el eje azul (Z) la dirección hacia donde el cielo debería quedar para la cámara.

El problema es conseguir que los ejes de la cámara tomen esta apariencia al desplazarse:



Y, además, permitir al jugador girar la cámara libremente como si de un shooter se tratase. El jugador debería poder controlar los ejes azul y rojo con el ratón.

Lo que he intentado hacer para solucionar el problema es muy burro y artesanal. El motor que uso tiene una instrucción para hacer que un objeto apunte a otro. Lo que he intentado es que la cámara en cada frame apunte al centro del planeta y después se le aplica la rotación a los ejes vertical y lateral que corresponda. El problema entonces es que según la latitud en que la cámara se encuentre, ésta gira bien o no. Y la verdad es que no tengo ni idea de por qué le pasa esto.

He estado buscando y he encontrado algo llamado cuaterniones (quaternions en el idioma del imperio) y aunque más o menos sé que es lo que hacen, no tengo ni idea de como aplicarlos al problema, aunque estoy casi seguro de que son parte de la solución.

Si alguien me puede ayudar se lo agradeceré de por vida. Si no pues nada, me busco otro entretenimiento.

kraj0t

Vendría bien que comentaras qué motor estás usando. Si estás usando Ogre, podría ayudarte de manera más precisa, porque conozco ese motor. Y si no es Ogre, seguro que alguien que lea esto puede ayudarte con el motor.

Dicho esto, a ver. Los quaternions... puff son algo jodidos. En Ogre, la clase Quaternion cuenta con métodos que te permiten trabajarlos de manera mucho más intuitiva, usando vectores y ángulos. Imagino (espero) que tu motor también contará con esos métodos que son básicos para cálculos con quaternions.

Prueba a poner este algoritmo en tu método Update de la cámara (en parentesis los nombres de variables):
1. pilla el quaternion (orientacionPrevia) de la cámara
2. pilla el eje de orientacionPrevia hacia donde está mirando tu camara (vectorDelante), en el caso de tu motor supongo que es el eje Y
3. calcula un nuevo vector (nuevoVectorNormal) pillando el vector de posicion actual de la camara y restandole el vector del centro del planeta.
4. normaliza nuevoVectorNormal. Con esto tienes en nuevoVectorNormal la dirección que apunta del centro del planeta a tu cámara.
5. haz el producto vectorial (cross product) entre el vectorDelante y el vectorNormal, y guardalo en un nuevo vector llamado nuevoVectorDerecha. Esto te está dando un vector ortogonal a los dos vectores, o para que se entienda mejor, un vector perpendicular al plano formado por esos dos vectores.
6. haz el producto vectorial entre nuevoVectorDerecha y nuevoVectorNormal y almacenalo en nuevoVectorDelante.
7. Ahora que tenemos los 3 vectores, uno para cada eje, podemos construir un quaternion (orientacionNueva) a partir de ellos. Algo que tal vez no sepas de los quaternion es que tienen que construirse a partir de 3 vectores ortogonales y normalizados. De ahí que hicieramos los productos vectoriales.
8. dale a la cámara la orientacionNueva, y listo.

Con esto te debería funcionar. Pero la verdad, con los detalles que has dado no sé si he escrito esta parrafada para nada o qué. ^_^'

PD: no sé si necesitarás que te dé tantos detalles, pero creo que es bueno explicarlo bien todo, por si alguien que sepa menos lee este post algún día.
Muerte y destrucción a tú
¿A yo?
¡A tú!

tamat

no veo el problema, normalmente las camaras se situan con una instruccion lookAt, que recibe donde está la camara, hacia donde apunta y la vertical. Lo unico diferente aquí es que la vertical en lugar de ser 0,1,0 será el vector normalizado que va desde el centro del planeta hasta la posición de la camara.
Por un stratos menos tenso

blau



Se me han adelantado, pero estoy de acuerdo. ;)

Lo unico que falta aqui es un poquito de manejo de vectores. Y establece un valor de distancia entre A y B que quede bien.

El vector direccion AB es el unico que tienes que ir rotando alrededor de Up para ir girando hacia un lado u otro. Solo necesitas almacenar un angulo.

espero que te ayude algo

zunou

 ??? ¿no será mas facil rotar el planeta en lugar de la cámara? Es mas sencillo que el planeta rote en un angulo segun la direccion a la que apunte la camara, pero no se si es eso lo que buscas exactamente.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.