Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Transformaciones segun una posicion relativa en OpenGL

Iniciado por ZüNdFoLGe, 13 de Abril de 2010, 05:36:32 AM

« anterior - próximo »

ZüNdFoLGe

Supongamos que he dibujado un triangulo, el mismo rota sobre su propio eje 'y' (ver codigo abajo).  Ahora bien, quiero que ademas rote segun el eje 'y' relativo al punto (0, 0, -6). Es decir, el triangulo deberia ademas rotar alrededor de ese punto, como si el triangulo fuera el planeta tierra y el punto fuera el Sol. Esto ultimo es lo que no he podido lograr  :-\

Alguien puede echar una mano?

Este es el codigo (el triangulo esta girando "estaticamente")


void DrawGLScene()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // borrado de buffers de dibujo y z
 glLoadIdentity(); // Inicializacion de la matriz de transformacion

 //Traslacion para el dibujo del triangulo
 glTranslatef(-1.5f,0.0f,-6.0f);

 // rtri tiene el angulo de giro
 glRotatef(rtri,0.0f,1.0f,0.0f);

 // Triangulo
 glBegin(GL_POLYGON);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
 glEnd();

...



Gracias de antemano

Buffon

Welcome to the university.

en el libro rojo de opengl tienes un ejemplo de como construir elementos que roten sobre varios sistemas de coordenadas a la vez.

Piensa siempre lo siguiente, las transformaciones en opengl se realizan al revés, se van stackeando en una pila así que la primera que pongas será la última en realizarse. Ahora bien, para que lo entiendas mejor.

Necesitas hacer 3 transformaciones, y el orden importa mucho, rotar sobre si mismo, trasladar, rotar sobre el sol, así que es importante que primero dibujes el "planeta" como si fuera el sol, lo rotes lo necesario sobre si mismo, lo traslades todo lo lejos del sol que debería estar y ahora lo rotes sobre el sol.

X' = triangulo en sistema de coordenadas final
R1 = rotación sobre si mismo
R2 = rotación sobre el sol
T1 = traslación al sol
X = triangulo en base ortografica inicial

X' = R2 * T1 * R1 * X

Si por ejemplo tienes n Planetas (X1,X2,...,Xn) y todos ellos giran sobre el mismo sol, deberás empezar a utilizar la pila de matrices con PushMatrix y PopMatrix.

for each ( ....)
    for each (...)

Buffon

lo encontré!!!

http://www.glprogramming.com/red/chapter03.html

Citar
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);

   glPushMatrix();
   glutWireSphere(1.0, 20, 16);   /* draw sun */
   glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
   foreach(planet) {
      glPushMatrix();
      glTranslatef (2.0, 0.0, 0.0);
      glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
      glutWireSphere(0.2, 10, 8);    /* draw smaller planet */
      glPopMatrix();
   }
   glPopMatrix();
   glutSwapBuffers();


tamat

Esta es una de las practicas que yo le suelo poner a mis alumnos para que aprendan sobre transformaciones geometricas, te recomiendo que te leas las slides que les doy cada año:

Transformaciones geometricas

la teoria sobre transformaciones es vital para poder trabajar en entornos 3D, no basta con hacer copypaste de codigo que encuentres por ahí porque a la larga no te servirá, necesitas enteder el por qué.
Por un stratos menos tenso

ZüNdFoLGe

#4
Agradezco me corrijan si he interpretado algo mal, en el código que comento entre lineas.

Le he echado mano al libro rojo para ver ese ejemplo y las diapositivas de tamat, aunque a tamat parece que no le gusta el stack de matrices  :P


  glClear (GL_COLOR_BUFFER_BIT);
  glColor3f (1.0, 1.0, 1.0);

  glPushMatrix();
  glutWireSphere(1.0, 20, 16);   /* draw sun */
  // esta rotación queda en el stack
  glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
  foreach(planet) {
     glPushMatrix();
     // cargo en el stack la traslación para "el planeta", esta transformacion queda ANTES que la rotacion del sol
     glTranslatef (2.0, 0.0, 0.0);
     // aplico la rotacion para el planeta sobre su eje 'y'
     glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
     // aplico a la esfera primero la traslación "hacia el sol" y luego la rotación (todo lo que tengo en el stack de matrices)
     glutWireSphere(0.2, 10, Cool;    /* draw smaller planet */
     // quito del stack la traslación hacia el sol, que fue la última matriz que coloqué en el stack
     glPopMatrix();
  }
  // quito la rotación del sol sobre su eje 'y'
  glPopMatrix();
  glutSwapBuffers();


gracias de antemano

ZüNdFoLGe

#5
Aqui dejo el codigo que he implementado por si a alguien le sirve algun dia. Funciona  ;)

Salu2


 glPushMatrix();

 glBegin(GL_POINTS);
     glVertex3f(0.0f, 0.0f, -6.0f);
 glEnd();

 glRotatef((GLfloat)alpha, 0.0f,1.0f,0.0f);

 glTranslatef(-1.5f,0.0f,0.0f);
 
 glRotatef((GLfloat)beta,0.0f,1.0f,0.0f);

 glBegin(GL_POLYGON);
       glColor3f(255.0f, 0.0f, 0.0f);
       glVertex3f( 0.0f, 1.0f, 0.0f);
      glColor3f(0.0f, 255.0f, .0f);
       glVertex3f( 1.0f,-1.0f, 0.0f);
      glColor3f(0.0f, 0.0f, 255.0f);
       glVertex3f(-1.0f,-1.0f, 0.0f);
 glEnd();

 glPopMatrix();

tamat

no es que no me guste, es que en las ultimas versiones de OpenGL ya no está, se considera deprecated
Por un stratos menos tenso

ZüNdFoLGe

Sí, por lo que he buscado al parecer se consideran deprecadas desde de la version 3.

Entre los "sustitutos" he visto GLSL e implementaciones caseras del stack.

Salu2

tamat

GLSL no reemplaza la pila de matrices, GLSL es un lenguaje de shaders.

La idea es que toda la gestión de las matrices la haces tú manualmente desde codigo, para ello necesitas tener varias clases que te encapsule el tema matrices y camaras.

En mi web tienes codigo util para estos casos, bajate el framework que usan mis alumnos
Por un stratos menos tenso

ZüNdFoLGe

#9
Cita de: tamat en 14 de Abril de 2010, 03:37:06 PM
GLSL no reemplaza la pila de matrices, GLSL es un lenguaje de shaders.

GLSL + Optional features = OpenGL Mathematics (GLM)

perdón, tal vez fui poco explícito en el mensaje anterior (debí haber escrito "Entre los "sustitutos" he visto implementaciones basadas en GLSL e implementaciones caseras del stack."

Gracias por la URL, hay material muy bueno y completo

salu2






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.