Frage

Ich versuche, eine einfache Drehung in OpenGL durchzuführen, aber es geht mir wohl nicht darum, worauf es ankommt.Ich suche weniger nach einer bestimmten Lösung als vielmehr nach einer kurzen Erklärung oder einem Link, der die OpenGL-Rotation allgemeiner erklärt.

Im Moment habe ich Code wie diesen:

glPushMatrix();
  glRotatef(90.0, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);        
    glVertex3f( 1.0, 1.0, 0.0 );        
    glVertex3f( 3.0, 2.0, 0.0 );        
    glVertex3f( 3.0, 1.0, 0.0 );        
  glEnd();
glPopMatrix();

Das Ergebnis ist jedoch kein um 90 Grad gedrehtes Dreieck.

BearbeitenHmm, danke an Mike Haboustak – es schien, als würde mein Code eine SetCamera-Funktion aufrufen, die glOrtho verwendet.Ich bin zu neu in OpenGL, um eine Vorstellung davon zu haben, was das bedeutet, aber das Deaktivieren und Drehen auf der Z-Achse führte zum gewünschten Ergebnis.

War es hilfreich?

Lösung

Erhalten Sie eine gerade Linie mit einer Einheit?Es scheint, dass 90 Grad verrotten.um Y herum werden Sie auf die Seite eines Dreiecks ohne Tiefe blicken.

Sie sollten stattdessen versuchen, sich um die Z-Achse zu drehen, und prüfen, ob Sie etwas Sinnvolleres erhalten.

OpenGL verfügt über zwei Matrizen, die sich auf die Anzeige von Geometrie beziehen: ModelView und Projection.Beide werden auf Koordinaten angewendet, bevor die Daten auf dem Bildschirm sichtbar werden.Zuerst wird die ModelView-Matrix angewendet, die die Daten vom Modellraum in den Ansichtsraum umwandelt.Anschließend wird die Projektionsmatrix angewendet, die die Daten aus dem Ansichtsbereich für die „Projektion“ auf Ihrem 2D-Monitor umwandelt.

ModelView wird verwendet, um mehrere Objekte an ihren Positionen in der „Welt“ zu positionieren. Projection wird verwendet, um die Objekte auf dem Bildschirm zu positionieren.

Ihr Code scheint in Ordnung zu sein, daher gehe ich davon aus, dass Sie durch das Lesen der Dokumentation wissen, was die Natur von Funktionen wie glPushMatrix() ist.Wenn das Drehen um Z immer noch keinen Sinn ergibt, überprüfen Sie, ob Sie die ModelView-Matrix bearbeiten, indem Sie glMatrixMode aufrufen.

Andere Tipps

Stellen Sie sicher, dass Sie die Modelview-Matrix ändern, indem Sie vor dem glRotatef-Aufruf Folgendes einfügen:

glMatrixMode(GL_MODELVIEW);

Andernfalls ändern Sie möglicherweise stattdessen entweder die Projektion oder eine Texturmatrix.

Die „akzeptierte Antwort“ ist nicht ganz korrekt – das Drehen um das Z hilft Ihnen nicht, dieses Dreieck zu sehen, es sei denn, Sie haben vor diesem Code einige seltsame Dinge getan.Das Entfernen eines glOrtho(...)-Aufrufs hätte das Problem in diesem Fall möglicherweise beheben können, aber Sie haben immer noch ein paar andere Probleme.

Zwei Hauptprobleme mit dem Code in der geschriebenen Form:

  • Haben Sie die Kamera vorher positioniert?In OpenGL befindet sich die Kamera am Ursprung und blickt entlang der Z-Achse nach unten, wobei Y positiv nach oben zeigt.In diesem Fall wird das Dreieck in derselben Ebene wie Ihr Auge gezeichnet, jedoch nach oben und rechts.Sofern Sie keine sehr seltsame Projektionsmatrix haben, werden Sie sie nicht sehen.gluLookat() ist der einfachste Befehl hierfür, aber jeder Befehl, der die aktuelle Matrix (die MODELVIEW sein sollte) verschiebt, kann zum Laufen gebracht werden.

  • Sie zeichnen das Dreieck linkshändig oder im Uhrzeigersinn, während die Standardeinstellung für OpenGL ein rechtshändiges Koordinatensystem ist, also gegen den Uhrzeigersinn.Das bedeutet, dass Sie das Dreieck nicht wie erwartet sehen würden, wenn Sie Rückseiten aussortieren (was Sie wahrscheinlich nicht tun, aber wahrscheinlich weitermachen werden, wenn Sie fortgeschrittener sind).Um das Problem zu erkennen, halten Sie Ihre rechte Hand vor Ihr Gesicht und stellen Sie sich vor, dass es sich in der X-Y-Ebene befindet, und bewegen Sie Ihre Finger in der Reihenfolge, in der Sie die Eckpunkte (1,1) bis (3,2) bis (3,1) zeichnen ).Dabei zeigt Ihr Daumen von Ihrem Gesicht weg, d. h. Sie blicken auf die Rückseite des Dreiecks.Sie müssen sich angewöhnen, Gesichter rechtshändig zu zeichnen, da dies in OpenGL üblich ist.

Das Beste, was ich empfehlen kann, ist die Verwendung der NeHe-Tutorials - http://nehe.gamedev.net/.Sie beginnen damit, Ihnen zu zeigen, wie Sie OpenGL in mehreren Systemen einrichten, gehen dann zum Zeichnen von Dreiecken über und gehen dann langsam und sicher zu fortgeschritteneren Themen über.Sie sind sehr einfach zu befolgen.

Als ich mir OpenGL zum ersten Mal ansah, war das NeHe-Tutorials (siehe linkes Menü) waren von unschätzbarem Wert.

Ich möchte ein Buch empfehlen:

3D-Computergrafik:Eine mathematische Einführung mit OpenGL von Samuel R.Buss

Es liefert sehr klare Erklärungen und die Mathematik ist weithin auf Nicht-Grafik-Domänen anwendbar.Sie finden auch eine ausführliche Beschreibung der orthographischen Projektionen vs.Perspektiventransformationen.

In Bezug auf die Projektionsmatrix finden Sie hier eine gute Quelle für den Anfang:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

Es erklärt ein wenig, wie man einen Typ von Projektionsmatrix erstellt.Die orthografische Projektion ist die einfachste/primitive Form einer solchen Matrix. Im Grunde nimmt sie zwei der drei Achsenkoordinaten und projiziert sie auf den Bildschirm (Sie können die Achsen immer noch umdrehen und skalieren, aber es gibt keinen Verzerrungs- oder Perspektiveffekt). .

Die Transformation von Matrizen ist wahrscheinlich eines der wichtigsten Dinge beim Rendern in 3D und umfasst im Wesentlichen drei Matrixstufen:

  • Transform1 = Objektkoordinatensystem in Welt (z. B. Objektdrehung und -skalierung)
  • Transform2 = Weltkoordinatensystem zur Kamera (Platzierung des Objekts an der richtigen Stelle)
  • Transform3 = Kamerakoordinatensystem zum Bildschirmraum (Projektion auf Bildschirm)

Normalerweise wird das Ergebnis der 3-Matrix-Multiplikation als WorldViewProjection-Matrix bezeichnet (falls Sie jemals auf diesen Begriff stoßen), da es die Koordinaten vom Modellraum über die Welt, dann zur Kamera und schließlich zur Bildschirmdarstellung transformiert.

Viel Spaß

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