Pregunta

Estoy intentando hacer una rotación simple en OpenGL pero debo no entender el punto.No estoy buscando una solución específica sino una explicación rápida o un enlace que explique la rotación de OpenGL de manera más general.

Por el momento tengo un código como este:

glPushMatrix();
  glRotatef(90.0, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);        
    glVertex3f( 1.0, 1.0, 0.0 );        
    glVertex3f( 3.0, 2.0, 0.0 );        
    glVertex3f( 3.0, 1.0, 0.0 );        
  glEnd();
glPopMatrix();

Pero el resultado no es un triángulo girado 90 grados.

EditarHmm, gracias a Mike Haboustak; parecía que mi código estaba llamando a una función SetCamera que usa glOrtho.Soy demasiado nuevo en OpenGL para tener idea de lo que esto significa, pero deshabilitarlo y girar en el eje Z produjo el resultado deseado.

¿Fue útil?

Solución

¿Obtienes una línea recta de 1 unidad?Parece que se pudre a 90 grados.alrededor de Y te hará mirar el lado de un triángulo sin profundidad.

En su lugar, deberías intentar girar alrededor del eje Z y ver si obtienes algo que tenga más sentido.

OpenGL tiene dos matrices relacionadas con la visualización de geometría, ModelView y Projection.Ambos se aplican a las coordenadas antes de que los datos sean visibles en la pantalla.Primero se aplica la matriz ModelView, transformando los datos del espacio modelo al espacio de visualización.Luego, se aplica la matriz de proyección y transforma los datos del espacio de visualización para "proyección" en su monitor 2D.

ModelView se usa para posicionar múltiples objetos en sus ubicaciones en el "mundo", Projection se usa para posicionar los objetos en la pantalla.

Su código parece estar bien, así que supongo que al leer la documentación sabe cuál es la naturaleza de funciones como glPushMatrix().Si rotar alrededor de Z aún no tiene sentido, verifique que esté editando la matriz ModelView llamando a glMatrixMode.

Otros consejos

Asegúrese de modificar la matriz de vista de modelo colocando lo siguiente antes de la llamada a glRotatef:

glMatrixMode(GL_MODELVIEW);

De lo contrario, es posible que esté modificando la proyección o una matriz de textura.

La "respuesta aceptada" no es del todo correcta: girar alrededor de la Z no le ayudará a ver este triángulo a menos que haya hecho algunas cosas extrañas antes de este código.Eliminar una llamada glOrtho(...) podría haber corregido el problema en este caso, pero aún tiene un par de problemas más.

Dos problemas importantes con el código tal como está escrito:

  • ¿Has colocado la cámara anteriormente?En OpenGL, la cámara está ubicada en el origen, mirando hacia abajo en el eje Z, con Y positivo hacia arriba.En este caso, el triángulo se dibuja en el mismo plano que tu ojo, pero hacia arriba y hacia la derecha.A menos que tengas una matriz de proyección muy extraña, no la verás.gluLookat() es el comando más sencillo para hacer esto, pero cualquier comando que mueva la matriz actual (que debería ser MODELVIEW) puede funcionar.

  • Estás dibujando el triángulo con el método para zurdos o en el sentido de las agujas del reloj, mientras que el valor predeterminado para OpenGL es un sistema de coordenadas para diestros o en el sentido contrario a las agujas del reloj.Esto significa que, si estás seleccionando caras posteriores (lo cual probablemente no sea así, pero probablemente avanzarás a medida que avances), no verás el triángulo como se esperaba.Para ver el problema, coloca tu mano derecha frente a tu cara y, imaginando que está en el plano X-Y, mueve tus dedos en el orden en que dibujas los vértices (1,1) a (3,2) a (3,1). ).Cuando haces esto, tu pulgar está de espaldas a tu cara, lo que significa que estás mirando la parte posterior del triángulo.Necesitas adquirir el hábito de dibujar caras con la mano derecha, ya que esa es la forma común de hacerlo en OpenGL.

Lo mejor que puedo recomendar es utilizar los tutoriales de NeHe. http://nehe.gamedev.net/.Comienzan mostrándole cómo configurar OpenGL en varios sistemas, pasan a dibujar triángulos y continúan lenta y seguramente con temas más avanzados.Son muy fáciles de seguir.

Cuando eché un primer vistazo a OpenGL, el tutoriales de NeHe (ver el menú de la izquierda) fueron invaluables.

Me gustaría recomendar un libro:

Gráficos por computadora en 3D:Una introducción matemática con OpenGL por Samuel R.autobús

Proporciona explicaciones muy claras y las matemáticas son ampliamente aplicables a dominios no gráficos.También encontrará una descripción detallada de las proyecciones ortográficas vs.transformaciones de perspectiva.

Con respecto a la matriz de proyección, puedes encontrar una buena fuente para comenzar aquí:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

Explica un poco sobre cómo construir un tipo de matriz de proyección.La proyección ortográfica es la forma muy básica/primitiva de dicha matriz y básicamente lo que hace es tomar 2 de las coordenadas de los 3 ejes y proyectarlas en la pantalla (aún puedes voltear los ejes y escalarlos, pero no hay efecto de deformación o perspectiva) .

La transformación de matrices es probablemente una de las cosas más importantes al renderizar en 3D y básicamente implica 3 etapas de matrices:

  • Transform1 = Sistema de coordenadas del objeto a Mundo (por ejemplo, rotación y escala del objeto)
  • Transform2 = Sistema de coordenadas mundiales a Cámara (colocando el objeto en el lugar correcto)
  • Transform3 = Sistema de coordenadas de la cámara al espacio de la pantalla (proyectando a la pantalla)

Por lo general, el resultado de la multiplicación de 3 matrices se conoce como matriz WorldViewProjection (si alguna vez se topa con este término), ya que transforma las coordenadas del espacio modelo a través del mundo, luego a la cámara y finalmente a la representación en pantalla.

Divertirse

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top