Buenas gente, estoy teniendo problemas con OpenGL y queria sacarme la duda a
ver si alguien le paso lo siguiente: Yo tengo una serie de clases C++ que
representan widgets u objetos dibujables en pantalla, entre ellos hay una
clase base llamada GL3DWidget que tiene 3 metodos protegidos y un metodo
publico:
los metodos protegidos y virtuales (para que cada subclase los sobreescriba)
son preDrawWidget() que se encarga de hacer todo lo que debe antes de
dibujar, drawWidget() que se encarga de dibujar el objeto propiamente dicho
y postDrawWidget() que se ejecuta de hacer todo lo que debe despues de
dibujar... y ademas hay un metodo publico llamdo draw() que hace lo
siguiente:
void GL3DWidget::draw() {
preDrawWidget();
drawWidget();
postDrawWidget();
Tambien tengo un metodo update() que en base al input de teclado registrado
updatea coordenadas de dibujo y demas, ademas poseo una clase derivada de
GL3DWidget llamada GLSphereWidget cuyo proposito es dibujar una esfera
texturizada con la cual a partir e presionar ciertas teclas yo puedo ir
girando sobre la esfera. El tema es que tengo problemas con OpenGL que
cuando posiciono la camara con gluLookAt la esfera deja de dibujarse en
pantalla y cuando remuevo la linea que invoca a gluLookAt la esfera se
muestra bien....
Este es el codigo de la esfera GLSphereWidget:
void GLSphereWidget::loadTexture(const std::string& imageFileName) {
glEnable(GL_TEXTURE_2D);
SDL_Surface * mapaSurface = IMG_Load(imageFileName.c_str());
if (mapaSurface) {
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
SDL_LockSurface(mapaSurface);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,mapaSurface->w,
mapaSurface->h,GL_BGR_EXT, GL_UNSIGNED_BYTE,
mapaSurface->pixels);
SDL_UnlockSurface(mapaSurface);
SDL_FreeSurface(mapaSurface);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
}
}
void GLSphereWidget::update() {
lastTime = SDL_GetTicks();
int newTime = SDL_GetTicks();
double deltaTime = (newTime - lastTime) / 1000.0;
lastTime = newTime;
double distancePrime = 0.0, alphaPrime = 0.0, betaPrime = 0.0;
if (GLKeyManager::isKeyPressed(SDLK_LEFT))
alphaPrime -= 0.5;
if (GLKeyManager::isKeyPressed(SDLK_RIGHT))
alphaPrime += 0.5;
if (GLKeyManager::isKeyPressed(SDLK_DOWN))
betaPrime -= 0.5;
if (GLKeyManager::isKeyPressed(SDLK_UP))
betaPrime += 0.5;
if (GLKeyManager::isKeyPressed(SDLK_PAGEDOWN))
distancePrime += 5.0;
if (GLKeyManager::isKeyPressed(SDLK_PAGEUP))
distancePrime -= 5.0;
alpha += deltaTime * alphaPrime;
beta += deltaTime * betaPrime;
distance += deltaTime * distancePrime;
alpha = (alpha > 2 * PI) ? alpha - 2 * PI : alpha;
alpha = (alpha < -2 * PI) ? alpha + 2 * PI : alpha;
beta = (beta > 1.0) ? 1.0 : beta;
beta = (beta < -1.0) ? -1.0 : beta;
}
void GLSphereWidget::drawWidget() {
glMatrixMode(GL_MODELVIEW);
// Cargo la identidad.
glLoadIdentity();
// Guardo en el stack la matriz.
glPushMatrix();
// Cargo la matriz de proyeccion.
glMatrixMode(GL_PROJECTION);
// Cargo la identidad
glLoadIdentity();
// Guardo la matriz en el stack.
glPushMatrix();
// Translado coordenadas del origen
glTranslatef(0.0f, 0.0f, 0.0f);
std::cout << alpha << " " << beta << " " << distance << std::endl;
gluLookAt(
distance * cos(alpha) * cos(beta),
distance * sin(alpha) * cos(beta),
distance * sin(beta) ,
0.0, 0.0, 0.0,
0.0, 0.0, 1.0);
// Habilito la textura
glBindTexture( GL_TEXTURE_2D, texture );
glEnable(GL_TEXTURE_2D);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
// Dibujo esfera
gluSphere(sphere, radius, 20, 20);
// Deshabilito la textura
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_2D);
// Cargo matriz.
glPopMatrix();
// Cargo matriz.
glPopMatrix();
}
El tema es que la esfera se dibuja bien, de forma texturizada en el centro
de la pantalla, solo si remuevo la linea que invoca a gluLookAt, de forma
contraria con gluLookAt la esfera nunca se muestra, probe usando valores por
defecto al invocar gluLookAt para ver si era que no me generaba bien los
balores de alpha, beta y distance, pero no es, ya no se que puede estar
siendo.
Si alguien tiene alguna idea por favor si me puede dar una mano se lo voy a
agradecer mucho.
Saludos
Pablo
--
Si yo tengo una manzana y tú tienes una manzana, luego de intercambiarlas
ambos tenemos una manzana. Si yo tengo una idea y tú tienes una idea, luego
de intercambiarlas ambos tenemos dos ideas.
Apoyando a la comunidad Open Source.
Facebook prifile:
http://www.facebook.com/profile.php?id=1244601012
Orkut prifile:
http://www.orkut.com/Profile.aspx?uid=12594853021246287134
--
Si yo tengo una manzana y tú tienes una manzana, luego de intercambiarlas
ambos tenemos una manzana. Si yo tengo una idea y tú tienes una idea, luego
de intercambiarlas ambos tenemos dos ideas.
Apoyando a la comunidad Open Source.
Facebook prifile:
http://www.facebook.com/profile.php?id=1244601012
Orkut prifile:
http://www.orkut.com/Profile.aspx?uid=12594853021246287134
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion