Estoy realizando pruebas con OpenGL+C ( No me recomienden otro por que antes de cambiarme quiero solucionar este problema ), y estoy con las luces. mi problema radica en que la luz no apunta a donde deberia de apunter ( Algo asi como un Eje ), ya que se mueve emisor d ela luz a otra coordenada y obviamente el eje (en este caso esta representado con una espera solida) deberia estar SIEMPRE iluminado, pero no es asi...
alguien me puede ayudar?
Código
#include <windows.h> #include "include/OpenGL/CGL.h" // Posicion de la luz X, Y, Y, {el 4to elemento indica si es en una posicion infinita 1=NO, 0=SI} float fposition[4] = {0.0f, 0.0f, 1.0f, 1.0}; void drawZones() { ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Borramos la pantalla y el buffer de profundidad ::glLoadIdentity(); // Camara. ::gluLookAt( 0, 0, 5, // Posicon X, Y, Z. 0, 0, -1, // Hacia donde vemos X, Y, Z. 0.0f, 1.0f, 0.0f ); // Cielo X, Y, Z. GLfloat fDirection[] = {0.0,0.0,-1.0}; // Dirrecion hacia adonde apuntamos. //Configuramos nuestra Luz. ::glEnable ( GL_LIGHT0 ); ::glLightfv ( GL_LIGHT0, GL_POSITION, fposition ); ::glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection); ::glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 5 ); ::glutSolidSphere(100, 4000, 4000); // Esfero que nos representara las paredes. // Las siguiente son las esferas donde esta la luz. // Posicion del emisor de luz. ::glPushMatrix (); ::glColor3f ( 1.0f , 0.0f , 0.0f ); ::glTranslatef ( fposition[0],fposition[1],fposition[2] ); ::glutWireSphere ( 0.2, 50 , 50 ); ::glPopMatrix (); // Posicion Destino hacia donde se emite la luz. ::glPushMatrix(); ::glColor3f( 0.0f , 0.0f , 1.0f ); ::glTranslatef( fDirection[0],fDirection[1],fDirection[2] ); ::glutSolidSphere( 0.2, 50 , 50 ); ::glPopMatrix(); // Mostramos. ::glutSwapBuffers(); } void keyBoardSFunc(int key, int x, int y) { if (key == GLUT_KEY_LEFT) fposition[0] -= 0.1; if (key == GLUT_KEY_RIGHT) fposition[0] += 0.1; if (key == GLUT_KEY_UP) fposition[1] -= 0.1;; if (key == GLUT_KEY_DOWN) fposition[1] += 0.1; } void timer( int val ) { ::glutTimerFunc ( 10 , timer, 0); ::glutPostRedisplay ( ); } int main() { CGL oWindow; oWindow.creaVentanaGL ( "Hola Mundo desde OpenGL" , 1024 , 726 , 0 , 0 , false ); ::glutDisplayFunc ( drawZones ); ::glutSpecialFunc ( keyBoardSFunc ); ::glutTimerFunc ( 10, timer, 0 ); ::glutMainLoop (); return EXIT_SUCCESS; }
CGL.cpp
Código
#include "OpenGL/cgl.h" //--------------------------------------------------------------- // Nombre: Constructor // Descripcion: Constructor de la clase. Inicializa las variables // Parametros: Ninguno //--------------------------------------------------------------- CGL::CGL() { int_Win = 0; } //--------------------------------------------------------------- // Nombre: Destructor // Descripcion: Destructor de la clase // Parametros: Ninguno //--------------------------------------------------------------- CGL::~CGL() { eliminaVentanaGL(); } //--------------------------------------------------------------- // Nombre: inicializaEscenaGL // Descripcion: Inicializa los parametros iniciales de la escena // Parametros: // Glsizei ancho: Ancho de la escena // Glsizei alto: Alto de la escena //--------------------------------------------------------------- void CGL::inicializaEscenaGL(GLsizei ancho, GLsizei alto) { if ( alto <= 0 ) // Previene de la división entre 0 { alto=1; // Establece la altura = 1 } ::glViewport ( 0 , 0 , ancho , alto ); // Resetea el actual puerto de visión (ViewPort) ::glMatrixMode ( GL_PROJECTION ); // Selecciona la matriz de proyección ::glLoadIdentity ( ); // Resetea la matriz de proyección ::gluPerspective ( 45.0f , (GLfloat)ancho/(GLfloat)alto , 1.0f , 300000.0f ); // Calcula el Aspect Ratio de la ventana ::glMatrixMode ( GL_MODELVIEW ); // Selecciona la matriz de modelado ::glLoadIdentity ( ); // Resetea la matriz de modelado } //--------------------------------------------------------------- // Nombre: iniGL // Descripcion: Inicializa los valores iniciales de OGL // Parametros: Ninguno //--------------------------------------------------------------- bool CGL::iniGL(void) { GLfloat ambientLight[] = { 0.1f, 0.1f, 0.1f, 1.0f }; ::glShadeModel ( GL_SMOOTH ); // Activa sombreado suave (Smooth Shading) ::glClearDepth ( 1.0f ); // Depth Buffer Setup ::glEnable ( GL_DEPTH_TEST ); // Activa Z-Buffer ::glDepthFunc ( GL_LEQUAL ); // El tipo de Depth Testing que se va a realizar ::glHint ( GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST ); // Muy buena correción de perspectiva ::glEnable ( GL_TEXTURE_2D ); // Activa mapeado de texturas ::glColorMaterial ( GL_FRONT , GL_AMBIENT_AND_DIFFUSE ); ::glClearColor ( 0.0f , 0.0f , 0.0f , 1.0f ); ::glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE , 1 ); // habilita ambas caras (FRONT-iluminada & BACK-oscurecida) de los poligonos ::glLightModelfv ( GL_LIGHT_MODEL_AMBIENT , ambientLight ); // luz ambiental de toda la escena ::glEnable ( GL_COLOR_MATERIAL); // habilita el color para los materiales (poligonos rellenos) ::glEnable ( GL_LIGHTING ); return true; } //--------------------------------------------------------------- // Nombre: eliminaVentanaGL // Descripcion: Destruye toda la información sobre la ventana GL // Parametros: Ninguno //--------------------------------------------------------------- void CGL::eliminaVentanaGL(void) { ::glutDestroyWindow( this->int_Win ); this->int_Win = 0; } //--------------------------------------------------------------- // Nombre: CrearVentanaGL // Descripcion: Crea una ventana OGL // Parametros: // char* Titulo: Titulo de la ventana // int ancho: Ancho de la ventana o en modo pantalla completa // int alto: Alto de la ventana o en modo pantalla completa // bool fullscreen: Usar pantalla completa (TRUE) o ventana (FALSE) //--------------------------------------------------------------- bool CGL::creaVentanaGL(const char* Titulo, GLsizei ancho, GLsizei alto, GLsizei x, GLsizei y, bool fullscreen) { if ( x < 0 ) { x=0; } if ( y < 0 ) { y=0; } ::glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGBA ); ::glutInitWindowPosition ( x , y ); ::glutInitWindowSize ( ancho , alto ); this->int_Win = ::glutCreateWindow( Titulo ); ::glutSetWindow( this->int_Win ); if ( fullscreen == true ) ::glutFullScreen(); inicializaEscenaGL ( ancho , alto ); // Inicializamos la escena en perspectiva GL if ( !iniGL() ) { eliminaVentanaGL(); return false; } return true; }
CGL.h
Código
#ifndef _cGL_H_ #define _cGL_H_ // INCLUDES ////////////////////////////////////// #include <windows.h> // Archivo cabecera para Windows #include <GL/glut.h> class CGL { public: CGL (); virtual ~CGL (); bool creaVentanaGL (const char* Titulo, GLsizei ancho, GLsizei alto, GLsizei x, GLsizei y, bool fullscreen); void inicializaEscenaGL (GLsizei ancho, GLsizei alto); // Cambia de tamaño e inicializa la ventana GL void eliminaVentanaGL (void); // Elimina la ventana int int_Win; void inilight (GLfloat ligt[]); private: bool iniGL (void); // Todas la inicializaciónes de OpenGl vienen aqui }; #endif
Temibles Lunas!¡