Mover objetos en OpenGL

DArgo

Hola chicos,

Estoy haciendo un proyecto en OpenGL y necesito saber como mover objetos. Os explico un poco: mi proyecto es un zepelin (concretamente el hindenburg) hecho con todo detalle y bueno, he pensado que no estaría mal que el zepelin volara en circulos.

He buscado cosas por la red, pero no he encontrado nada que se acerque lo más mínimo, ya que en muchos casos hablaba sobre mover el punto de vista, pero eso no me soluciona nada ya que alrededor de el hay una serie de texturas para simular cielo y tierra, de forma que si de verdad se moviera se notaría bastante.

Gracias y saludos ;)

r2d2rigo

Todo se basa en jugar con glTranslate y glRotate ;)

Primero haces un glPushMatrix, para guardar la matriz de rototraslacion. Luego haces un glTranslate con las coordenadas de tu zeppelin, a continuacion un glRotate con sus angulos, luego lo dibujas, y por ultimo restauras la matriz:

glPushMatrix();
glTranslatef(PosicionZeppelin);
glRotatef(RotacionZeppelin);
DibujarZeppelin();
glPopMatrix();

maRc

Si me acuerdo bien, las transformaciones se aplican en orden inverso a como aparecen en el código.

En el caso del código de r2d2rigo, lo que hace es primero rotar y luego trasladar.

Edito para que no te rayes :P.

A

Mira éste tutorial:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05

De todos modos, como dice #2, es jugar con glTranslate y glRotate.

Por otra parte, también puedes crear un efecto parecido simplemente moviendo la cámara en órbitas, jugando con gluLookAt(); y gluPerspective() / glFrustum();

DArgo

Eso es justamente lo que hago... pero no funciona. He puesto para que al principio, en la funcion display dibuje el zepelin y cuando está idle llame a una funcion parecida a la de r2d2rigo pero aún así no me funciona... Que extraño.
De todas formas, muchas gracias por contestar ;)

A

No te habrás olvidao del glutPostRedisplay(); ?
(en caso de que uses Glut)

Aquí tienes un código que dibuja un planeta orbitando a otro, sacado del Redbook de Opengl.

#include "gl.h"
#include "glu.h"
#include "aux.h"

static int year = 0, day = 0;

void dayAdd (void)
{
day = (day + 10) % 360;
}

void daySubtract (void)
{
day = (day - 10) % 360;
}

void yearAdd (void)
{
year = (year + 5) % 360;
}

void yearSubtract (void)
{
year = (year - 5) % 360;
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glColor3f (1.0, 1.0, 1.0);
glPushMatrix();
    auxWireSphere(1.0);       
    glRotatef((GLfloat) year, 0.0, 1.0, 0.0);
    glTranslatef (2.0, 0.0, 0.0);
    glRotatef((GLfloat) day, 0.0, 1.0, 0.0);
    auxWireSphere(0.2);       
glPopMatrix();
glFlush();

}

void myinit(void)
{
glShadeModel(GL_FLAT);
}

void myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -5.0);
}

int main(int argc, char** argv)
{
auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
auxInitPosition(0, 0, 500, 500);
auxInitWindow(argv[0]);
myinit();
auxKeyFunc(AUX_LEFT, yearSubtract);
auxKeyFunc(AUX_RIGHT, yearAdd);
auxKeyFunc(AUX_UP, dayAdd);
auxKeyFunc(AUX_DOWN, daySubtract);
auxReshapeFunc(myReshape);
auxMainLoop(display);
}

Saludos.

r2d2rigo

Si nos haces un pastebin te lo revisamos y tal :P

maRc, en realidad si quiere hacer una orbita circular solo le haria falta un glRotate y un glTranslate, pero en orden inverso al que he puesto antes; es como las coordenadas polares/rectangulares. Si primero llamas a glRotate y luego a glTranslate, la geometria se dibuja en la posicion final con el angulo de rotacion especificado; si lo haces al reves, primero traslada la geometria a la posicion final y luego la rota alrededor del origen de coordenadas, asi que si quiere que el zeppelin haga circulos perfectos supongo que glTranslate/glRotate sera mas efectivo que glRotate/glTranslate.

maRc

Es verdad, me había rayado mucho. Pensaba que con solo un rotate/traslate (en el orden que sea), el zepelín estaría apuntando siempre hacia la misma dirección..

Lo que había puesto arriba es para simular movimiento de traslación y rotación, que es lo que ha puesto Archville :)

Usuarios habituales

  • maRc
  • r2d2rigo
  • Archville
  • DArgo