Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con vectores y movimiento

Iniciado por PIM, 20 de Febrero de 2013, 07:34:26 PM

« anterior - próximo »

PIM

Hola queridos amigos de esta estupenda Web. De nueva cuenta solicitando de su ayuda para resolver un problema. Uso OpenGL y tengo un cubo que quiero mover por la pantalla, quiero que cuando yo lo rote en alguno de sus ejes, este se mueva en la dirección a la que apunta. Algo como esto:



En este caso el cubo está siendo visto desde arriba. Lo muevo y luego quiero rotarlo. Quiero que ahora se mueva en la dirección en la que apunta.  Si lo vuelvo a rotar que se mueva en la nueva dirección.

Ojalá esté claro lo que quiero hacer.

Les agradezco de antemano.

Muchas gracias.
;)

AgeR

Hola,

¿Cuál es el problema con el que te has encontrado exactamente? Sabiendo el ángulo en uno de los ejes lo tienes sencillo para calcular el vector de dirección.

Saludos!

PIM

#2
Hola, gracias por contestar.  Tienes razón con respecto a obtener el vector de dirección, mi problema es hacer que el objeto se traslade según ese vector de dirección. Si realizo una translación usando sólo glTranslatef el objeto se mueve según el eje que use, por ejemplo si uso glTranslatef(0.0,0.0,-1.0), el objeto se traslada -1.0 en el eje Z. Pero lo que yo quiero es que el objeto se traslade -1.0 pero hacia a donde "mira", es decir según su vector de dirección.

Ojalá esté un poco más claro lo que quiero hacer.

Muchas gracias
;)

Darago_malaga

#3
Tendras que usar las funciones de seno y coseno. Para un angulo dado "a" que gira alrededor de "y"

x=cos(a)*velocidad;
z=sin(a)*velocidad;

En tu caso el eje y no se vera afectado nunca y sera siempre 0

Velocidad es el avance total en linea recta que quieres, en tu caso 1

Ten cuidado si guardas el valor del angulo en grados ya que estas funciones pueden usar radianes.

Alomejor, tambien necesitaras añadir #include <math.h>

Mirate : http://stackoverflow.com/questions/4981622/move-in-direction-of-rotation-in-opengl

PIM

Parece  que ya funciona como yo quería. :D

Muchas gracias por su ayuda.
;)

Gallo

Puedes ver un ejemplo de como moverte en la dirección en la que apuntas en este video, en el minuto 6:43 aprox:

http://www.youtube.com/watch?v=_1hZDi-zx2I

La api es de SmoothStep2D pero el concepto es el mismo.

PIM


Ray

si no esto equivocado la solución correcta es multiplicar la matriz de la posición del objeto por una matriz de traslación, por ejemplo para avanzar 10 unidades hacia delante sería esta.

1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,10,1 (aqui están x, y , z y se pone 10 en la z, que es hacia delante).

El tema es que tienes que asociar una matriz a cada objeto, entonces hacer las operaciones sobre dicha matriz. Cada operación que hagas la modificará y con ella la orientación, posición, e incluso escala del objeto si quieres.

Después para dibujarlo basta con multiplicar la matriz modelview por la matriz del objeto y listo.

PIM

Parece más lógico así. Sin embargo el problema sería hacer la multiplicación de matrices en tiempo real, y eso lleva "mucho" tiempo computacionalmente hablando. ¿Conoces algún modo eficiente y rápido de hacer esto?

Muchas gracias por tu respuesta.
;)

Ray

yo creo que es perfectamente asumible, ¿cuantos objetos piensas mover?

Bueno, si coges una función que multiplique matrices, desenrollas sus bucles y omites las multiplicaciones por 0, seguro que se gana algo, pero en principio no me complicaría la vida con esto, y usaría glLoadMatrix y glMultMatrix, o mejor una librería auxiliar o una clase para operar con matrices.

Luego también de esta manera se pueden enlazar las multiplicaciones de matrices para mantener una jerarquía, es decir, un brazo con respecto a un cuerpo tendrá siempre una posición concreta 10,5,0 por ejemplo (a menos que se desmembre), si a la hora de dibujar coges la multiplicación de modelview por el cuerpo y la multiplicas por la posición del brazo, obtienes la posición absoluta del brazo en el espacio, si la multiplicas por la matriz de la pierna obtienes la de la pierna, no es necesario mover todas las extremidades o partes de un mismo objeto conjuntamente con el cuerpo en cada movimiento, por lo que se ahorran muchas operaciones, y por supuesto las puedes rotar libremente porque al enlazar multiplicaciones siempre se mantendrán unidas al cuerpo.

Para mantener todo esto lo mejor es crear una clase que contenga como principal dato una matriz, y las funciones avanzar, rotar, orientar, obtener posición, etc. y que se puedan asignar objetos hijos de la misma clase. que puedas obtener su matriz local y su matriz global (teniendo en cuenta a los padres), como digo basta multiplicar,

matriz global de la mano = matriz cuerpo * matriz brazo * matriz local
matriz para dibujar segun el punto de vista = modelview *matriz global

Esa clase la asignas a los personajes de la escena o haces clases heradadas y ya está. En mi opiniòn es mejor hacer clases heredadas, y así tener por ejemplo esa clase, y luego otra heredada que contenga un modelo 3D, sus respectivos bounding box para calcular colisiones, luego otra para personajes animados, etc. De este modo podrás usar la clase que te convenga según para lo que se use.







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.