2010-11-10 35 views
6

Actualmente estoy tratando de usar OpenGL (con SDL) para dibujar un cubo en la ubicación donde dejé clic en la pantalla y luego llevarlo a apunte a la posición en la pantalla donde hago clic derecho.Encontrar los ángulos para los ejes X, Y y Z en 3D - OpenGL/C++

Puedo dibujar con éxito un cubo en mi ubicación deseada usando gluUnproject - Significando que ya sé las coordenadas de las cuales está mi cubo.

Sin embargo, no sé cómo calcular todos los ángulos necesarios para que mi punto de cubo en la nueva ubicación.

Por supuesto, sigo utilizando gluUnproject para encontrar las coordenadas de mi clic derecho, pero solo sé cómo girar alrededor del eje Z utilizando gráficos 2D.

Por ejemplo, antes, si quería rotar un quad alrededor del eje Z (por supuesto, esto sería una vista de arriba hacia abajo donde el eje Z todavía "atraviesa" la pantalla) en 2D haría algo como :

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX); 
glRotatef(angle*180/PI, 0, 0, 1); 

Mi pregunta es, ¿cómo voy a hacer esto en 3D?

  • ¿Necesito calcular los ángulos para cada eje como lo hice anteriormente?
  • Si es así, ¿cómo puedo calcular el ángulo de rotación alrededor de los ejes X e Y?
  • Si no es así, ¿qué método debo usar para lograr los resultados deseados?

Cualquier ayuda es muy apreciada.

+0

¿Cómo se especifica la coordenada z representado por cada clic del ratón? Si simplemente establece ambos en 0, entonces la geometría 2D es suficiente, y supongo que esa no es su intención. –

+0

Un clic en un espacio 3D debería definir un rayo, no un punto. Tengo curiosidad por saber cómo se logró ubicar el cubo en primer lugar. – tafa

+0

@Marcelo Cantos: Perdóneme si he entendido mal su pregunta, pero soy nuevo en esto y, aunque creo que sé lo que está pidiendo, aún puedo tener la idea equivocada.Básicamente, si mi cubo está en (100, 200, 300) y hago clic en (400, 500, 600), necesito encontrar los ángulos en los que necesito rotar el cubo para que vea el segundo conjunto de coordenadas –

Respuesta

9

Si el cubo está en A = (x0, y0, z0)

Si el cubo está estudiando B = (x1, y1, z1)

y si desea que se vea en C = (x2, y2, z2) luego;

let v1 ser el vector de A a B

v1 = B - A

y V2 sea el de la A a C

v2 = C - A

Primera Normalizar ellos.

v1 = v1/|v1| 
v2 = v2/|v2| 

luego calcular el ángulo de rotación y el eje de rotación como

angle = acos(v1*v2) //dot product 
axis = v1 X v2 //cross product 

Puede llamar glRotate con

glRotate(angle, axis[0], axis[1], axis[2]) 
+0

Muchas gracias por esta respuesta tafa. He estado buscando tutoriales y otros recursos sobre el tema durante los últimos días, y probado con productos dot, etc., pero como recién vengo de 2D, no tenía mucho sentido para mí. Pero su respuesta me ha explicado todo lo que necesitaba saber de una manera muy clara, que ninguno de los recursos que encontrado en google podría. Gracias –

+0

@Sour Lemon, me alegra oír eso. – tafa

Cuestiones relacionadas