OpenGL - problemas na iluminação nos eixos (0,0,0)

Delphi

04/01/2008

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


Rickyale2

Rickyale2

Curtidas 0

Respostas

Rickyale2

Rickyale2

04/01/2008

Pelo que parece a Luz tem origem sempre do Eixo 0,0,0 .


GOSTEI 0
Rickyale2

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!


GOSTEI 0
Rickyale2

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
POSTAR