Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL ( Error Luz ). No apunta a donde deberia.

Iniciado por BlackZeroX, 23 de Julio de 2011, 10:08:23 AM

« anterior - próximo »

BlackZeroX

.
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 (c) [Seleccionar]


#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 (c) [Seleccionar]



#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 (C) [Seleccionar]


#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!¡






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.