Frage

Ich zeichne Gebäude in meiner Spielwelt, i Schatten sie mit dem folgenden Code:

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);

Es funktioniert gut.

Aber wenn ich in der Welt zu fliegen beginnen, die Beleuchtung reagiert auf das, als ob die Welt ein Objekt, das gedreht wird. Also das Licht ändert sich, wenn meine Kamerawinkel ändert.

Wie zurückkehren ich diese Rotation? so dass die Beleuchtung würde denken, dass ich bin eigentlich nicht die Welt zu drehen, und dann konnte ich meine Gebäude haben statische Schattierung machen, die in Abhängigkeit davon, würde ich ändern, wo die Sonne am Himmel ist.

Edit: hier ist der Rendering-Code:

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
}
War es hilfreich?

Lösung

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

Siehe # 18.050

Kurz gesagt, müssen Sie sicherstellen Sie definieren Ihre Lichtposition im rechten Referenzrahmen und das Aufbringen der entsprechenden Transformationen jeden Rahmen zu halten, wo Sie es wollen.

Andere Tipps

Ich glaube, Ihr Problem entsteht aus der Tatsache, dass OpenGL Lichter in Weltkoordinaten angegeben werden, sondern intern in der Kamera Koordinaten gespeichert. Dies bedeutet, dass, sobald Sie ein Licht zu platzieren, wenn Sie Ihre Kamera bewegen, wird dein Licht mit ihm bewegen.

Um dies zu beheben, indem Sie die Lichter neu positionieren, wenn Sie Ihre Kamera bewegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top