OpenGL - problemas na iluminação nos eixos (0,0,0)
Olá pessoal,
Estou estudando o opengl utilizando delphi, e estou construindo um heightmap como um programa de aprendizado. O mapa foi fácil fazer já que a lógica é quase a mesma do 2d. Quando cheguei nas luzes a coisa ficou meio estranha. Eu sei que luzes no opengl não são fáceis para calibrar, eu não estou conseguindo entender a lógica pq cada número que mudo na definição das luzes muda tudo na tela do opengl.
O problema principal mesmo é se eu estiver com a camera no ponto (x=1, y=1, z=1) TUDO que foi desenhado antes do eixo (x=0,y=0,z=0) ficam totalmente pretos. O mesmo acontece se for ao contrário. É como se tivesse uma divisão mo ponto 0,0,0. Ou ele clareia antes ou clareia depois desse ponto.
O que pretendo é colocar uma luz ambiente e uma luz como se fosse o Sol para que as sombras fossem igualmente distribuidas em todo o mapa.
Não ocorre a continuação da luz de forma uniforme entre os eixos zero.
Segue umas imagens para ajudar a entender o problema.
[b:a2904d664e]Nessa imagem da para ver que tudo que está antes do eixo Z=0 fica preto. Enquanto que as luzes do Eixo X não acontece a mesma coisa.[/b:a2904d664e]
[b:a2904d664e]Nesta eu movi com a camera para o ouro lado do eixo Z (Z<0) e acontece o contrário[/b:a2904d664e]
[b:a2904d664e]Aqui é se eu ficar no meio do eixo Z (Z=0) com a camera nenhum dos dois lados é iluminado[/b:a2904d664e]
[b:a2904d664e]Esta é uma representação das normais caculadas, parecem está corretas, mas como eu posso ter certeza? tem que estar virada contra a superficie do objeto como esta agora?[/b:a2904d664e]
Aqui estão todas as luzes que eu defini para ter esse resultado, porém mesmo mudando várias luzes e tipos o problema do eixo 0 sempre está lá.
[i:a2904d664e]
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 1);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
//glEnable(GL_NORMALIZE);
glFrontFace(GL_CW); <- Já ´tooglei´
// glCullFace(GL_BACK); <- Já ´tooglei´
// glEnable(GL_CULL_FACE); <- Já ´tooglei´
// glLightModel(GL_LIGHT_MODEL_TWO_SIDE, 0);
// glColorMaterial (GL_FRONT, GL_DIFFUSE);
// glMaterialfv(GL_FRONT,GL_SPECULAR, @mat_spec);
// glMateriali(GL_FRONT, GL_SHININESS, 128);
// glEnable ( GL_FRONT_FACE );
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @FAmbient);
FAmbient[0] = 1.0;
FAmbient[1] = 1.0;
FAmbient[2] = 1.0;
FAmbient[3] = 1.0;
glLightfv(GL_LIGHT0, GL_AMBIENT, @FAmbient);
FDiffuse[0] = 0.5;
FDiffuse[1] = 0.5;
FDiffuse[2] = 0.5;
FDiffuse[3] = 1.0;
glLightfv(GL_LIGHT0, GL_DIFFUSE, @FDiffuse);
FSpecular[0] = 1.0;
FSpecular[1] = 1.0;
FSpecular[2] = 1.0;
FSpecular[3] = 1.0;
glLightfv(GL_LIGHT0, GL_SPECULAR, @FSpecular);
FPosition[0] = 1.0;
FPosition[1] = 1.0;
FPosition[2] = 1.0;
FPosition[3] = 1.0;
glLightfv(GL_LIGHT0, GL_POSITION, @FPosition);
glEnable(GL_LIGHT0);
[/i:a2904d664e]
espero que alguém já tenha passado por isso ou tenha uma dica do que estou fazendo errado. Já Li e continuo lendo várias tutoriais sobre luzes e nenhum fala nada como as luzem devem ser posicionadas se são ou não relativas ao observador. mas acho que esse problema do eixoZ é algo além das definições das luzes. talvez..
valeu!!
Estou estudando o opengl utilizando delphi, e estou construindo um heightmap como um programa de aprendizado. O mapa foi fácil fazer já que a lógica é quase a mesma do 2d. Quando cheguei nas luzes a coisa ficou meio estranha. Eu sei que luzes no opengl não são fáceis para calibrar, eu não estou conseguindo entender a lógica pq cada número que mudo na definição das luzes muda tudo na tela do opengl.
O problema principal mesmo é se eu estiver com a camera no ponto (x=1, y=1, z=1) TUDO que foi desenhado antes do eixo (x=0,y=0,z=0) ficam totalmente pretos. O mesmo acontece se for ao contrário. É como se tivesse uma divisão mo ponto 0,0,0. Ou ele clareia antes ou clareia depois desse ponto.
O que pretendo é colocar uma luz ambiente e uma luz como se fosse o Sol para que as sombras fossem igualmente distribuidas em todo o mapa.
Não ocorre a continuação da luz de forma uniforme entre os eixos zero.
Segue umas imagens para ajudar a entender o problema.
[b:a2904d664e]Nessa imagem da para ver que tudo que está antes do eixo Z=0 fica preto. Enquanto que as luzes do Eixo X não acontece a mesma coisa.[/b:a2904d664e]
[b:a2904d664e]Nesta eu movi com a camera para o ouro lado do eixo Z (Z<0) e acontece o contrário[/b:a2904d664e]
[b:a2904d664e]Aqui é se eu ficar no meio do eixo Z (Z=0) com a camera nenhum dos dois lados é iluminado[/b:a2904d664e]
[b:a2904d664e]Esta é uma representação das normais caculadas, parecem está corretas, mas como eu posso ter certeza? tem que estar virada contra a superficie do objeto como esta agora?[/b:a2904d664e]
Aqui estão todas as luzes que eu defini para ter esse resultado, porém mesmo mudando várias luzes e tipos o problema do eixo 0 sempre está lá.
[i:a2904d664e]
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 1);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
//glEnable(GL_NORMALIZE);
glFrontFace(GL_CW); <- Já ´tooglei´
// glCullFace(GL_BACK); <- Já ´tooglei´
// glEnable(GL_CULL_FACE); <- Já ´tooglei´
// glLightModel(GL_LIGHT_MODEL_TWO_SIDE, 0);
// glColorMaterial (GL_FRONT, GL_DIFFUSE);
// glMaterialfv(GL_FRONT,GL_SPECULAR, @mat_spec);
// glMateriali(GL_FRONT, GL_SHININESS, 128);
// glEnable ( GL_FRONT_FACE );
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @FAmbient);
FAmbient[0] = 1.0;
FAmbient[1] = 1.0;
FAmbient[2] = 1.0;
FAmbient[3] = 1.0;
glLightfv(GL_LIGHT0, GL_AMBIENT, @FAmbient);
FDiffuse[0] = 0.5;
FDiffuse[1] = 0.5;
FDiffuse[2] = 0.5;
FDiffuse[3] = 1.0;
glLightfv(GL_LIGHT0, GL_DIFFUSE, @FDiffuse);
FSpecular[0] = 1.0;
FSpecular[1] = 1.0;
FSpecular[2] = 1.0;
FSpecular[3] = 1.0;
glLightfv(GL_LIGHT0, GL_SPECULAR, @FSpecular);
FPosition[0] = 1.0;
FPosition[1] = 1.0;
FPosition[2] = 1.0;
FPosition[3] = 1.0;
glLightfv(GL_LIGHT0, GL_POSITION, @FPosition);
glEnable(GL_LIGHT0);
[/i:a2904d664e]
espero que alguém já tenha passado por isso ou tenha uma dica do que estou fazendo errado. Já Li e continuo lendo várias tutoriais sobre luzes e nenhum fala nada como as luzem devem ser posicionadas se são ou não relativas ao observador. mas acho que esse problema do eixoZ é algo além das definições das luzes. talvez..
valeu!!
Rickyale2
Curtidas 0
Respostas
Rickyale2
04/01/2008
Pelo que parece a Luz tem origem sempre do Eixo 0,0,0 .
GOSTEI 0
Rickyale2
04/01/2008
estava tendo outro problema junto com o de cima, eu montei uma classe de luz no delphi para facilitar os testes. E tinha declarado as cores da luz como array of glfloat, dinamica. o opengl tava ignorando o valor e deixando tudo preto onde era pra ser luz ambiente.
agora eu mudei para array[0..3] of glfloat e pelo menos a luz ambiente funcionou.
Porém o problema no eixo X continua acontecendo, mas pelo menos agora da pra testar de verdade...
[b:5ff8753dd4]Então atualizando o problema: [/b:5ff8753dd4]
A fonte de luz está variando com a posicao da camera, eu uso uma classe de camera que faz uso do glLookAt, conforme eu ando com a camera a luz é refletida de maneira diferente.
Eu sou novo no OpenGl mas achei que após definir a posicao da luz o reflexo devia ser o mesmo idependente da posicao do observador, como a luz do sol por exemplo.
Será que eu tenho que calcular a posição da luz baseada na posição do observador?
vlws!
agora eu mudei para array[0..3] of glfloat e pelo menos a luz ambiente funcionou.
Porém o problema no eixo X continua acontecendo, mas pelo menos agora da pra testar de verdade...
[b:5ff8753dd4]Então atualizando o problema: [/b:5ff8753dd4]
A fonte de luz está variando com a posicao da camera, eu uso uma classe de camera que faz uso do glLookAt, conforme eu ando com a camera a luz é refletida de maneira diferente.
Eu sou novo no OpenGl mas achei que após definir a posicao da luz o reflexo devia ser o mesmo idependente da posicao do observador, como a luz do sol por exemplo.
Será que eu tenho que calcular a posição da luz baseada na posição do observador?
vlws!
GOSTEI 0
Rickyale2
04/01/2008
======= RESPOSTA Q VEIO DO FORUM GAMEDEV============
Eu já tive o mesmo problema.
Depois de fazer gluLookAt() tens de fazer também glLightfv(GL_LIGHT0, GL_POSITION, @FPosition), não precisas de alterar os valores (Eu no meu código estou a fazer o mesmo também para as outras informações da luz, mas acho que não é necessário).
=============================================
fiquei uns 3 dias tentando entender a lógica da posicao da luz e o problema era esse mesmo.
Tem alguns detalhes que só quebrando a cabeça.. Todos os exemplos que peguei usavam um objeto fixo então sempre o GL_POSITION tava no init . :)
Agora entendi que tem que ´desenhar´ a luz tb, DEPOIS do glLookAt. :)
GOSTEI 0