Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : GLUT- Animation läuft nicht



RoCMe
21-08-2005, 23:23
Hey,
Ich versuche mich zurzeit in GLUT und OpenGL unter Linux.

Ich bin inzwischen imstande, Dreiecke und andere mehr oder wenige spannende geometrische Figuren in verschiedenen Farben zu zeichnen *g* Damit aber nicht genug - es soll mehr Bewegung ins Spiel. Aber aus irgendeinem Grund dreht sich das Dreieck nicht - und ich versteh nicht warum. Ich werde jetzt meinen kompletten Code posten, weil ich überhaupt nicht weiß, wo ich den Fehler suchen muss,,,


#include <stdlib.h>
#include <GL/glut.h>

bool fullscreen = false;
float angle = 0.0;

bool init()
{
glClearColor(0.93f, 0.93f, 0.93f, 0.0f);
return true;
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT); //alles "Überpinseln"
glColor3f(0.0f, 0.0f, 0.0f); //Farbe schwarz

angle = angle + 1; //Drehwinkel erhöhen
glRotatef(angle, 0.0f, 0.0f, 1.0f); //Rotieren


glBegin(GL_TRIANGLES); //Dreieck zeichnen
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f( 0.5f, -0.5f, 0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glEnd();

glFlush();
glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y)
{
if (key == 27)
exit(1);
}

void specialKeyboard(int key, int x, int y)
{
if (key == GLUT_KEY_F1)
{
fullscreen = !fullscreen;

if (fullscreen)
glutFullScreen();
else
{
glutReshapeWindow(500, 500);
glutPositionWindow(50, 50);
}
}
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);

glutInitWindowPosition(50, 50);
glutInitWindowSize(500, 500);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);

glutCreateWindow("05 - Primitives");

glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(specialKeyboard);

if (!init())
return 1;.

glutMainLoop();

return 0;
}


Das Dreieck wird einmal gezeichnet und bleibt dann immer so stehen - ich dahte aber eigentlich das nach dem Aufruf von glutMainLoop die display-Funktion immer wieder aufgerufen wird und damit auch anlge erhöht wird und sich das Dreieck somit dreht...

Brauche Hilfe ;-)
mfg

RoCMe
Das Dreieck wird normal angezeigt, aber dreht sich nicht. Nach meiner Vorstellung sollte aber gerade das pasieren - der Aufruf von glutMainLoop() bewirkt doch, das die vorher deklarierten Funktionen immer wieder durchlaufen werden - sprich das angle immer wieder erhöht wird und das Dreieck dann um den Winkel angl

RoCMe
22-08-2005, 14:15
Ich habe mal ein bischen mit dem Fenster rumgespielt: Wenn man die oben aufgeführte Anwendung zeitweise überdeckt (z.B. duch die "Startleiste" von KDE oder Firefox) und dann wieder offen legt, so sieht man ein gedrehtes Dreieck, was dann aber wieder stil steht. Ich komme also zu der Vermutung, dass das Dreieck zwar gedreht aber nicht neu gezeichnet wird oder aber, dass die display() - Routine nicht immer wieder aufgerufen wird, sondern nur, wenn etwas mit dem Fenster passiert - was ist denn nun richtig???
Hoffe auf Hilfe :)
mfg
RoCMe

jm3105
20-09-2005, 11:52
Tach,

Wenn ich mich nicht irre, wird die Display Methode wirklich nur dann aufgerufen, wenn das Fenster neu gezeichnet wird.

Ich habe für Animationen immer die glutTimerFunc() verwendet.

Gruß jm3105

bmann
20-09-2005, 18:54
Hi
hab zwar von glut fast keine Ahnung (und aus Lizenzgründen werde ich das auch nicht ändern), aber versuch mal ein glutIdleFunc(display); hinzuzufügen. Dann wird die display function immer aufgerufen, wenn das Programm sonst nichts zu tun hat.

Übrigens könnte es sein, dass sich das Programm leicht anders verhält als du erwartest:
als erstest rotierst du um 1 Grad, dann um 3 Grad, dann um 6 Grad und so weiter.
Jeder Aufruf von glRotate() erfolgt nämlich zusätzlich zum vorhergehenden Aufruf. D.h. wenn du bereits um 1 Grad gedreht hast (angle=1) und dann display aufrufst, wird zuerst angle erhöht und dann um diesen Wert zusätzlich rotieret, also insgesamt um 1+2=3 Grad. Wenn du das vermeiden willst setze ein glLoadIdentity() an den Anfang der Function, bzw. irgendwo vor glRotate().

CU
Andi