Pergunta

Eu desenho edifícios no meu mundo de jogos, eu os protege com o seguinte código:

GLfloat light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat light_position[] = {135.66f, 129.83f, 4.7f, 1.0f};

glShadeModel(GL_SMOOTH);

glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glColorMaterial(GL_FRONT, GL_AMBIENT);

Funciona bem.

Mas quando começo a voar no mundo, a iluminação reage a isso como se o mundo fosse um objeto que estava sendo girado. Portanto, as luzes mudam quando o ângulo da minha câmera muda.

Como faço para reverter essa rotação? Portanto, a iluminação pensaria que eu não estou girando o mundo, e então eu poderia fazer meus prédios ter sombreamento estático, o que mudaria dependendo de onde o sol está no céu.

EDIT: Aqui está o código de renderização:

int DrawGLScene()
{

    // stuff

    glLoadIdentity();

    glRotatef(XROT, 1.0f, 0.0f, 0.0f);
    glRotatef(YROT, 0.0f, 1.0f, 0.0f);
    glRotatef(ZROT, 0.0f, 0.0f, 1.0f);

    glTranslatef(-XPOS, -YPOS, -ZPOS);

    // draw world
}
Foi útil?

Solução

http://www.opengl.org/resources/faq/technical/lights.htm

Veja #18.050

Em suma, você precisa garantir que esteja definindo sua posição de luz no quadro de referência certo e aplicar as transformações apropriadas para cada quadro para mantê -lo onde desejar.

Outras dicas

Acredito que seu problema surge do fato de que as luzes do OpenGL são especificadas nas coordenadas mundiais, mas armazenadas internamente nas coordenadas da câmera. Isso significa que, depois de colocar uma luz, sempre que move sua câmera, sua luz se moverá com ela.

Para consertar isso, basta reposicionar suas luzes sempre que você mover sua câmera.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top