Open GL - Ayuda con iluminacion

   
Vista:

Ayuda con iluminacion

Publicado por Sefirot3000 (1 intervención) el 12/06/2008 12:54:02
Buenas, a ver si podéis ayudarme. Quiero dibujar un sol que ilumine la escena global con luz amarilla. Lo que pasa es que, al poner el foco de luz en el centro de la escena, y luego dibujar el sol también en el centro, el foco de luz queda dentro del sol, por lo que la cara exterior de este no se ilumina, y se ve negro (los demás objetos sí que se iluminan).

No sé si me he explicado bien, pero la idea es poder dibujar un objeto (en este caso una estrella) que ilumine él mismo a los objetos de alrededor (con luz difusa).

Gracias, un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con iluminacion

Publicado por Fitopawer (9 intervenciones) el 23/04/2009 20:51:21
Bueno pues debes fijarte bien en tu luz ambiental y las normales de tus figuras, además de la posición de la luz que quieres agregar

GLfloat Especular[0] = .20f;
GLfloat Especular[1] = .20f;
GLfloat Especular[2] = .20f;
GLfloat Especular[3] = 1.0f;

GLfloat Difuso[0] = .10f;
GLfloat Difuso[1] = .10f;
GLfloat Difuso[2] = .10f;
GLfloat Difuso[3] = 1.0f;

GLfloat Ambiental[0] = 1.0f;
GLfloat Ambiental[1] = 1.0f;
GLfloat Ambiental[2] = 1.0f;
GLfloat Ambiental[3] = 1.0f;

GLfloat Posicion[0] = 0.0f;
GLfloat Posicion[1] = 0.0f;
GLfloat Posicion[2] = 150.0f;
GLfloat Posicion[3] = 1.0;

bool Encender = true;

int nLuz = GL_LIGHT0 + iLuz;

glLightfv(nLuz,GL_POSITION,Posicion);
glLightfv(nLuz,GL_AMBIENT ,Ambiental);
glLightfv(nLuz,GL_DIFFUSE ,Difuso);
glLightfv(nLuz,GL_SPECULAR,Especular);

if(Encender)
glEnable (nLuz);
else
glDisable(nLuz);

te paso este código y recuerda que los arreglos se dividen en 4 que son RGBA o sea Rojo, verde, azul y alpha al igual la posición x,y,z. Fijate bien en tus valores si a la luz difusa le das un valor mayor de .2 ya no se observa muy bien y se ven muy marcada la triangulación. la ambiental si es bueno que le des un valor grande, cercano a uno y la speculuar casi no pinta esa modificala a tu antojo.

Las normales de tus vértices son muy importantes porque sin ellas no hace efecto la luz difusa y si están mal puestas se ve horrible, te dejo más código

void CalculaNormales(void)

Vector p;
Vector q;
Vector n;
Vertice v1;
Vertice v2;
Vertice v3;
float modulo;

for(int i=0;i<=nTriangulos-2;i++)
{

v1.x = VertexArray[IndexArray[i].a].x;
v1.y = VertexArray[IndexArray[i].a].y;
v1.z = VertexArray[IndexArray[i].a].z;

v2.x = VertexArray[IndexArray[i].b].x;
v2.y = VertexArray[IndexArray[i].b].y;
v2.z = VertexArray[IndexArray[i].b].z;

v3.x = VertexArray[IndexArray[i].c].x;
v3.y = VertexArray[IndexArray[i].c].y;
v3.z = VertexArray[IndexArray[i].c].z;

p.xi = v1.x - v2.x;
p.yi = v1.y - v2.y;
p.zi = v1.z - v2.z;

q.xi = v1.x - v3.x;
q.yi = v1.y - v3.y;
q.zi = v1.z - v3.z;

n.xi = p.yi*q.zi-p.zi*q.yi;
n.yi = (p.xi*q.zi-p.zi*q.xi)*(-1);
n.zi = p.xi*q.yi-p.yi*q.xi;

modulo = sqrt(pow(n.xi,2)+pow(n.yi,2)+pow(n.yi,2));

n.xi = (n.xi/modulo);
n.yi = (n.yi/modulo);
n.zi = (n.zi/modulo);

NormalArray[i].x = n.xi;
NormalArray[i].y = n.yi;
NormalArray[i].z = n.zi;

}
}
Vector y Vertice son estructuras con x,y,z en float.

Solo asocia tu arreglo de vertices con tu arreglo de normales, este código es por si tu modelo fue hecho con VRML, ,a .b .c son los indices de que vertice debe ir pegado con cual. Revisa como obtener vectores normales unitarios de un plano.

Espero haberte ayudado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar