11 Stimmen

OpenGL-Drehung

Ich versuche, eine einfache Drehung in OpenGL zu tun, aber muss den Punkt zu verpassen. Ich bin nicht auf der Suche nach einem spezifischen Fix so viel wie eine schnelle Erklärung oder Link, der OpenGL Rotation allgemeiner erklärt.

Im Moment habe ich folgenden Code:

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.

Editar Hmm dank Mike Haboustak - es schien, dass mein Code eine SetCamera-Funktion aufrief, die glOrtho verwendet. Ich bin zu neu in OpenGL, um eine Idee zu haben, was dies bedeutete, aber deaktivieren Sie diese und drehen in der Z-Achse produziert das gewünschte Ergebnis.

7voto

spate Punkte 366

Stellen Sie sicher, dass Sie die Modelview-Matrix ändern, indem Sie Folgendes vor den glRotatef-Aufruf setzen:

glMatrixMode(GL_MODELVIEW);

Andernfalls können Sie stattdessen entweder die Projektion oder eine Texturmatrix ändern.

7voto

Mike Haboustak Punkte 2236

Erhalten Sie eine gerade Linie von 1 Einheit? Es scheint, dass eine Drehung um 90 Grad um Y dazu führt, dass Sie auf die Seite eines Dreiecks ohne Tiefe schauen.

Versuchen Sie stattdessen, um die Z-Achse zu rotieren, um zu sehen, ob Sie etwas Sinnvolleres erhalten.

OpenGL hat zwei Matrizen, die sich auf die Darstellung von Geometrie beziehen, die ModelView und die 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 transformiert. Dann wird die Projection-Matrix angewandt, die die Daten aus dem Ansichtsraum für die "Projektion" auf Ihren 2D-Monitor transformiert.

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, also gehe ich davon aus, dass Sie nach dem Lesen der Dokumentation wissen, was die Natur von Funktionen wie glPushMatrix() ist. Wenn das Drehen um Z immer noch keinen Sinn macht, überprüfen Sie, ob Sie die ModelView-Matrix bearbeiten, indem Sie glMatrixMode aufrufen.

5voto

Perry Punkte 226

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 könnte das Problem in diesem Fall behoben haben, aber Sie haben immer noch ein paar andere Probleme.

Es gibt zwei große Probleme mit dem Code in seiner jetzigen Form:

  • Haben Sie die Kamera zuvor positioniert? In OpenGL befindet sich die Kamera am Ursprung und blickt auf der Z-Achse nach unten, mit positivem Y als oben. In diesem Fall wird das Dreieck in der gleichen Ebene wie Ihr Auge gezeichnet, aber nach oben und nach rechts. Es sei denn, Sie haben eine sehr seltsame Projektionsmatrix, werden Sie es nicht sehen. gluLookat() ist der einfachste Befehl, um dies zu tun, aber jeder Befehl, der die aktuelle Matrix (die MODELVIEW sein sollte) bewegt, kann zum Funktionieren gebracht werden.

  • Sie zeichnen das Dreieck linksdrehend oder im Uhrzeigersinn, während OpenGL standardmäßig ein rechtsdrehendes oder gegen den Uhrzeigersinn gerichtetes Koordinatensystem verwendet. Das bedeutet, dass Sie das Dreieck nicht wie erwartet sehen würden, wenn Sie Rückseiten abziehen (was Sie wahrscheinlich nicht tun, aber mit zunehmender Erfahrung wahrscheinlich tun werden). Um das Problem zu erkennen, halten Sie Ihre rechte Hand vor Ihr Gesicht und bewegen Sie Ihre Finger in der Reihenfolge, in der Sie die Eckpunkte (1,1), (3,2) und (3,1) zeichnen. Dabei zeigt Ihr Daumen von Ihrem Gesicht weg, das heißt, Sie schauen auf die Rückseite des Dreiecks. Sie müssen sich angewöhnen, Flächen rechtshändig zu zeichnen, da dies die übliche Methode in OpenGL ist.

Das Beste, was ich empfehlen kann, sind die NeHe-Tutorials - http://nehe.gamedev.net/ . Sie beginnen damit, Ihnen zu zeigen, wie Sie OpenGL in verschiedenen Systemen einrichten, gehen zum Zeichnen von Dreiecken über und fahren langsam und sicher mit fortgeschritteneren Themen fort. Sie sind sehr leicht zu verstehen.

1voto

Ant Punkte 1168

Als ich einen ersten Blick auf OpenGL warf, war die NeHe-Tutorials (siehe Menü links) waren von unschätzbarem Wert.

1voto

Adam Hollidge Punkte 759

Ich würde Ihnen gerne ein Buch empfehlen:

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

Es bietet sehr klare Erklärungen, und die mathematischen Grundlagen sind auch auf andere Bereiche als die Grafik anwendbar. Sie finden auch eine gründliche Beschreibung von orthografischen Projektionen und perspektivischen Transformationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X