OpenGL > Rotation von Polygonen
-
Ich habe ein Polygon, dass ich mit Hilfe verschiedener Tasten um alle drei Achsen (x, y und z) rotieren lassen kann. Wenn ich nun keine Rotationstaste drücke, so soll das Polygon zwar gezeichnet aber natatürlich nicht weiterrotiert werden.
Also will ich es zeichnen, so wie es im letzten Moment des Tastendrückens im Raum lag.Nun stellt sich mir die Frage, wie die 4 Parameter von glRotatef(angle, x, y, z) dazu aussehen müssen. Die einzige (aber umständliche) Methode, die mir dazu einfällt ist, dass man jede der von Anfang an getätigten Rotationen in einem Array oder ähnlichem aufzeichnet und dann in einer Schleife alle nacheinander vor jedem Neuzeichnen ablaufen lässt. Das kommt mir aber sehr (unnötig) kompliziert vor.
Ich hoffe ihr versteht wo mein Problem liegt und könnt mir helfen.
-
Ich habe dein Problem hier bei mir mal zum Teil nachgestellt:
// ---- RenderScene() ---- // glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glRotatef( X, 0.0f, 1.0f, 0.0f ); // rotiert das Dreieck um die Y-Achse um X grad glBegin( GL_TRIANGLES ); // zeichnet dreieck glVertex3f( 0.0f, 0.5f, 0.0f ); glVertex3f( -0.5f, -0.5f, 0.0f ); glVertex3f( 0.5f, -0.5f, 0.0f ); glEnd();
X ist global deklariert. Und je nach dem, ob eine Taste gedrückt ist oder nicht, ist X=0.5f (oder sonst was) oder X=0.0f.
Also bei mir hat es so funktioniert, wie du es willst.
MfG Aoeke
-
Das meine ich nicht. Ich habe 6 Tasten, damit ich jeweils um alle 3 Achsen im oder gegen den Uhrzeigersinn rotieren kann.
Wenn ich nun am Anfang des Programms eine Zeit lang um die y-Achse rotieren lasse [glRotatef(angle, 0, 1, 0)] und dann um die z-Achse rotieren lassen will [glRotatef(angle, 0, 0, 1)], dann ist die Lage des Polygons im Raum nicht so wie sie sein sollte.Der Grund dafür ist, dass sich die neue, korrekte Lage dadurch ergeben müsste, dass man die alte Lage nimmt und die neue Rotation dazuaddiert. Das macht man aber nicht, wenn man obigem Schema folgt.
-
Nochmal ganz einfach erklärt:
Ich habe 6 Tasten, damit ich jeweils um alle 3 Achsen im oder gegen den Uhrzeigersinn rotieren kann. Die Lage des Polygons im Raum hat sich also durch eine Vielzahl von "rotiere hierhin" und "rotiere dahin".
Wenn ich nun ein neues Polygon erzeuge, wie kann ich es dann in einem Schritt die Raumlage von Polygon 1 einnehmen lassen?
-
hmm...scheint so als ob du dir selbst rotationsmatrizen basteln müsstest :), da du für sowas die die momentane rotationsmatrix von polygon 1 bräuchtest
bye
apo
-
Scheint so als hättest du mich wirklich verstanden.
Aber ist dieser Umstand denn wirklich notwendig, d.h. bietet OpenGL keine Möglichkeit das Ganze einfacher zu lösen?
-
da kann ich dir leider auch nich weiterhelfen
stehe selbst an den anfängen von opengl
bye
tt
-
Hat jemand ein Stück Quellcode, wo man durch Tasteneingabe ein Dreieck, Quadrat oder sonstwas um seine eigenen Achsen rotieren lassen kann?
-
du willst doch einfach nur das dein objekt sich dreht wenn du eine taste drückst, und stehen bleibt wenn du sie los lässt oder?
wenn ja, dann setz einfach ein glLoadIdentity() vor die rotate funktion,
dann müsste das so klappen.ich hoffe ich konnte dir helfen
MfG
Stefan
-
Ne, so einfach ist das nicht.
Mein Problem scheint am sogenannten gimbal lock zu liegen, weshalb ich gerade dabei bin, mir Quaternionen anzuschauen, mit dem man dieses Problem umgehen kann.
-
was ist wenn du die einzelnen Rotationen hintereinander Durführst?
glRotatef (x_winkel, 1,0,0);
glRotatef (y_winkel, 0,1,0);
glRotatef (z_winkel, 0,0,1);
-
Ne, bringt nix, hab' ich schon probiert.
-
Tobias Dallmann schrieb:
Ne, bringt nix, hab' ich schon probiert.
Dann hast du glaub ich was falsch gemacht.
-
Hallo,
Ich lasse mein Objekt mit der Maus rotieren. Du musst halt nur die Funktionen für deine Tastatursteuerung übertragen. Fertig. Aus.
void __fastcall TForm1::OpenGL1GLInit(TObject *Sender) { ... //definiere Objekt ... } void __fastcall TForm1::OpenGL1GLPaint(TObject *Sender) { ... glRotatef (GLfloat(rot_y), 1.0, 0.0, 0.0 ); glRotatef (GLfloat(rot_x), 0.0, 1.0, 0.0 ); glCallList(1); glLoadIdentity(); glFlush(); } void __fastcall TForm1::OpenGL1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if ( enabled ) //Maustaste gedrückt { rot_x = rot_x + (X - last_x); rot_y = rot_y + (Y - last_y); last_x = X; last_y = Y; OpenGL1->Repaint(); } }
-
Hi, bin zwar auch noch nicht lange bei OpenGL. aber normal zeichnet man Polygone in dem man ihre Pos und Rotation festhält und dann in jedem Frame erst macht glLoadIdentity() und anschließend die komplette Rotatiion mit den gespeicherten Werten wiederherstellt. Ein Tastendruck bewirkt dann das die Werte für die Rotation sich einfach verändern..
du scheinst das so zu machen daß ein Tastendruck unmittelbar eine Rotation bewirkt, dann kannst du aber eben den Rotationswinkel nicht mehr nachvollziehen nach mehreren Rotationen, was ja genau dein Problem ist, wenn ich das richtig kapiert hab
also machs einfach wie oben gesagt und schon sollte es funzen..oder spricht irgendwas gegen die obere Möglichkeit?
ansonsten könntes du auch einfach den Call von glRotate mit lauter nullen machen, das sollte eigentlich acuh bewirken, daß nix weiter rotiert wird