.
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?
CGL.cpp
CGL.h
Temibles Lunas!¡
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!¡