[OpenGL] gamedev.net Moving+Rotating lights example - Frage
-
Hi,
eigentlich wollte ich diese Frage im Forum bei nehe.gamedev.net stellen, aber dort gibt es Probleme beim Verschicken der Aktivierungscode-eMail.
Also, in dem Beispiel aus dem Buch Opengl Game Programming gibt es ein Beispiel für rotierende und bewegende Lichter. Hier mal ein Ausschnitt (auf rote Lichter beschränkt):[cpp]
float lightpositionR[] = {0.0f, 0.0f, 75.0f, 1.0f};
float diffuselightR[] = {1.0f, 0.0f, 0.0f, 1.0f};
float specularlightR[] = {1.0f, 0.0f, 0.0f, 1.0f};float spotdirection[] = {0.0f, 0.0f, -1.0f};
float diffuselight[] = {0.5f, 0.5f, 0.5f, 1.0f};
float specularlight[] = {1.0f, 1.0f, 1.0f, 1.0f};
float lightposition[] = {0.0f, 0.0f, 100.0f, 1.0f};float objectXrot, objectYrot, objectZrot;
float redXrot, redYrot;void InitOpenGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuselight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularlight);
glLightfv(GL_LIGHT0, GL_POSITION, lightposition);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 40.0f);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 80.0f);glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuselightR);
glLightfv(GL_LIGHT1, GL_SPECULAR, specularlightR);
glLightfv(GL_LIGHT1, GL_POSITION, lightpositionR);glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR, specularlight);
glMateriali(GL_FRONT, GL_SHININESS, 128);
}void Render()
{
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();glTranslatef(0.0f, 0.0f, -200.0f);
glPushMatrix();
glRotatef(redYrot, 0.0f, 1.0f, 0.0f);
glRotatef(redXrot, 1.0f, 0.0f, 0.0f);glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuselightR);
glLightfv(GL_LIGHT1, GL_POSITION, lightpositionR);
glLightfv(GL_LIGHT1, GL_SPECULAR, specularlightR);glTranslatef(lightpositionR[0], lightpositionR[1], lightpositionR[2]);
glColor3f(1.0f, 0.0f, 0.0f);glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
auxSolidSphere(2.5f);
glEnable(GL_LIGHTING);
glPopAttrib();
glPopMatrix();glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f);
glRotatef(objectXrot, 1.0f, 0.0f, 0.0f);
glRotatef(objectYrot, 0.0f, 1.0f, 0.0f);
glRotatef(objectZrot, 0.0f, 0.0f, 1.0f);
auxSolidCube(70.0f);
glPopMatrix();glFlush();
SwapBuffers(g_hdc);objectXrot += 0.01f;
objectYrot += 0.02f;
objectZrot += 0.01f;redXrot += 0.3f;
redYrot += 0.1f;
}
[/cpp]Die Zeilen
glRotatef(redYrot, 0.0f, 1.0f, 0.0f); glRotatef(redXrot, 1.0f, 0.0f, 0.0f);
sind dafür verantwortlich, dass das Licht um den Würfel rotiert bzw. wandert. Jedoch fehlt mir hier das Verständnis, warum das so ist, da ich glRotatef() nur als Beispiel zum Rotieren um die eigene Achse kenne. Könnte das jemand mal bitte erläutern bzw. erklären, da ich glTranslatef() für sinniger halte!
-
Hi,
zuerst wird Rotiert, dann Transformiert. Ist doch gut so?
glTranslatef(lightpositionR[0], lightpositionR[1], lightpositionR[2]);
-
Huch, oh, die Codezeile muß ich wohl überlese haben...
Ja, danke, ich glaube jetzt wird es mir klar!