So erhalten Sie Koordinaten eines Objekts in OpenGL

8

Ich möchte die Koordinaten eines Objekts (z. B. eines Dreiecks) erhalten, nachdem es übersetzt und gedreht wurde. Der Grund dafür ist, dass ich später eine Kollisionserkennung durchführen und den Abstand zwischen Objekten berechnen kann Koordinaten. Ich denke, dass ich gluProject verwenden muss, aber nicht sicher bin. Was sind auch die Unterschiede zwischen den verschiedenen Koordinatenräumen, z. Welt, Objekt etc.

Ich habe etwas Code darunter ist ein Kreis in der Mitte eines Quadrats, wie würde ich erkennen, wenn der Kreis eine der Kanten berührt, ich kann es mit den Pfeiltasten nach oben, unten, links, rechts bewegen Ändert die X- oder Y-Koordinaten, aber ich möchte nur eine grundlegende Kollisionserkennung durchführen können und ich weiß nicht, wie ich es machen soll.

%Vor%     
rjs 24.11.2011, 14:51
quelle

2 Antworten

11
  

Was sind auch die Unterschiede zwischen den verschiedenen Koordinatenräumen, z. Welt, Objekt etc.

Dies ist meistens eine Frage der Konvention, aber:

  • Modellbereich (= lokaler Raum) ist der Koordinatenraum eines bestimmten Modells relativ zu seinem "Mittelpunkt". Wenn Sie eine Datei mit einem Modell haben, sind die Koordinaten um einen Punkt zentriert (z. B. ist es das geometrische Zentrum, seine Basis, alles tatsächlich).

  • Szenenbereich (= Welt-Raum) ist der Koordinatenraum relativ zu einem beliebigen Punkt Ihrer Szene

  • Augenabstand (= Ansichtsraum) ist der Bereich, in dem die Kamera den Punkt (0,0,0) , x nach rechts, y nach oben und z faces out des Bildschirms ( -z = tiefer)

  • Platz im Clip ist% (-1,-1,*) ist die linke untere Ecke des Ansichtsfensters, (1,1,*) ist die obere rechte Ecke des Ansichtsfensters und die Z-Koordinate in (-1, 1) zeigt nur die Tiefe an (wieder kleiner Z = tiefer). (Fragmente

  • Bildschirmbereich (= Fensterkoordinaten) ist derselbe wie oben, nur dass die Koordinaten von -1..1 auf pixelbasierte Werte skaliert werden, die dem Bereich des aktuellen Ansichtsfensters und der aktuellen Tiefe entsprechen Bereich.

Sie transformieren Koordinaten vom Modellraum in den Szenenraum, indem Sie (in OpenGL-Konventionen, die normalerweise links multipliziert werden) mit einer Modellmatrix multiplizieren (die Informationen darüber enthält, wo sich das Modell in der Szene befindet). Wenn Sie eine Szenenhierarchie haben, kann es viele "gestapelte" Modellmatrizen für ein Objekt geben (Platzierung des Schwertes relativ zu einem Arm, Arm relativ zu einem Ritter, Ritter relativ zur Szene).

Dann transformieren Sie die Koordinaten in den Augenraum, indem Sie mit einer Ansichtsmatrix multiplizieren (normalerweise mit einem "Kamera" -Objekt verbunden).

Danach transformieren Sie diese Koordinaten mit einer Projektionsmatrix in den Bildschirmbereich, sodass OpenGL diese Koordinaten den tatsächlichen Bildschirmpixeln zuordnen würde (abhängig von der Einstellung des Darstellungsbereichs).

Einige Fakten:

  • Modell- und Ansichtsmatrizen enthalten normalerweise Translation, Rotation und / oder Skalierung, während Projektionsmatrix normalerweise eine perspektivische Transformation enthält, die die Objekte weiter vom Bildschirm kleiner erscheinen lässt.

  • Mit Old OpenGL (2.x und früher) mussten Sie die Matrizen auf zwei "Matrixstacks" setzen:

    • GL_MODELVIEW Stapel, der View * Model (oder View * Model1 * Model2 ... * ModelN),
    • enthalten sollte
    • GL_PROJECTION-Stack, der nur die Projection-Matrix enthalten soll.

Dies können auch einzelne Matrizen sein, nicht Stacks, aber der Stack (zusammen mit glPushMatrix und glPopMatrix ) wurde eingeführt, damit der Programmierer sie leicht speichern und laden kann. Nur die "oberste" Matrix von jedem Stapel wird in Berechnungen verwendet.

Die Projektionsmatrix wird normalerweise mit gluPerspective oder äquivalent erstellt. Die Ansichtsmatrix kann mit gluLookAt (oder ähnlich zu Modellmatrizen) erstellt werden, und die Modellmatrizen können einfach mit glTranslate , glRotate und glScale erstellt werden.

(Hinweis: OpenGL 3.1+ hat diese Features entfernt, sodass Sie beliebige Matrizen und Konventionen verwenden können, die Sie bevorzugen)

Wissen, dass:

  

Ich möchte die Koordinaten eines Objekts (z. B. eines Dreiecks) erhalten, nachdem es übersetzt und gedreht wurde. Der Grund dafür ist, dass ich später eine Kollisionserkennung durchführen und den Abstand zwischen Objekten berechnen kann Koordinaten

Eine vernünftige Methode, all deine Physik zu berechnen, besteht darin, sie im Szenenraum auszuführen.

Wenn Sie also ein Modell (z. B. ein Dreiecksnetz) haben, um die Position eines beliebigen Eckpunkts im Szenenbereich zu erhalten, müssen Sie es nur mit dem -Modell des Modells nach links multiplizieren Matrix (oder im Falle der Hierarchie, von allen seinen Modellmatrizen).

Über gluProject , falls Sie sich gewundert haben - es ist eine bequeme Methode, mit der Sie eine Menge von Koordinaten mit der aktuellen PROJECTION*MODELVIEW multiplizieren können und eine Ansichtsfenster-Transformation durchführt, um zu sehen, wo sie im Bildschirmbereich landen würde. co_de% macht das Gegenteil.

Ref: Ссылка

    
Kos 24.11.2011, 15:45
quelle
3

Beachten Sie neben Kos 'Antwort, dass OpenGL keine Szenenverwaltungsbibliothek ist . Es ist nur eine Zeichen-API, die Dinge auf den Bildschirm zeichnet und dann vergisst. Ebenso hat es kein Verständnis dafür, was ein "Objekt" ist, es kennt nur Dreiecke und selbst diese können sich nicht erinnern, nachdem sie gezeichnet wurden. Ich habe mich nie gewundert, warum man die ganze Szene für jeden Frame neu aufbereiten muss?

Um also die absolute Position eines Objekts in der Szene zu kennen, sollten Sie die Transformationen selbst verfolgen und seine Position daraus berechnen.

    
Christian Rau 24.11.2011 16:41
quelle

Tags und Links