Wie man die Koordinaten eines Objekts in OpenGL
Ich möchte in der Lage sein, um die Koordinaten eines Objekts (z.B. Dreieck), nachdem es übersetzt worden und gedreht, der Grund, warum ich dies tun wollen ist, so dass später kann ich tun, Kollisionserkennung und Berechnung der Entfernung zwischen den Objekten mit den Koordinaten. Ich denke, ich hätte zu verwenden, gluProject aber nicht sicher. Auch, was sind die Unterschiede zwischen den verschiedenen Koordinatenräumen z.B. Welt -, Objekt etc.
Habe ich einige code unten es ist ein Kreis in der Mitte ein Quadrat, wie würde ich erkennen, wenn der Kreis berührt die Kanten, ich kann mich bewegen es Runde mit dem oben,unten,Links, rechts-Tasten, es ändert nur die x-oder y-Koordinaten, aber ich möchte einfach in der Lage sein zu tun, einige grundlegende Kollisionserkennung und ich weiß nicht, wie es zu tun.
glPushMatrix();
glColor3f(0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, -5.0f);
glScalef(0.5f, 0.5f, 0.0f);
glBegin(GL_POLYGON);
glVertex3f(-5.0f, -5.0f, 0.0f);
glVertex3f(5.0f, -5.0f, 0.0f);
glVertex3f(5.0f, 5.0f, 0.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);
glEnd();
glPopMatrix();
glPushMatrix();
glColor3f(1.0f, 0.0f, 0.0f);
glTranslatef(x, y, -20.0f);
glBegin(GL_POINTS);
glVertex3f(-5, -5, 10.0f);
glEnd();
GLUquadricObj *qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj, GLU_FILL);
gluSphere(qobj, 1.0f, 20, 20);
gluDeleteQuadric(qobj);
glPopMatrix();
- Ich nehme an, Ihr Dreieck ist irgendwo gespeichert (ein array, etc)... einfach.
- Die OpenGL? (Ich nehme an, 2.1 oder früher)
- ja OpenGL 2.1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist hauptsächlich eine Frage der Konvention, aber:
Modell space (= local space) ist der Raum koordinieren ein bestimmtes Modell, relativ zu seiner "Mitte". Wenn Sie eine Datei mit einem Modell, das die Koordinaten zentriert sind rund um einen Punkt (es ist z.B. geometrische Mitte, die Basis, alles eigentlich).
Szene Raum (= Welt-Raum) ist die Koordinate Raum relativ zu einem beliebigen Zeitpunkt in Ihrer Szene
Auge Raum (= view space) ist der Raum, wo die Kamera ist im Punkt
(0,0,0)
,x
Gesichter rechtsy
Gesichter undz
Gesichter aus der Bildschirm (-z
= tiefer)Clip space ist, wo
(-1,-1,*)
ist in der unteren linken Ecke des Viewports(1,1,*)
ist die Obere Rechte Ecke des Viewports, und der Z-Koordinate in (-1,1) zeigt nur die Tiefe (wieder kleiner Z = tiefer). (FragmentePlatz auf dem Bildschirm (= Fenster-Koordinaten) ist die gleiche wie oben, außer dass die Koordinaten rescaled von
-1..1
pixel-basierte Werte passend zu den Bereich des aktuellen viewport-und Tiefenbereich.Transformation von Koordinaten aus dem Modellbereich zu Szene Raum durch die Multiplikation (im OpenGL-Konventionen in der Regel Links-Multiplikation) durch eine Modell matrix (enthält die Informationen, wo das Modell ist in der Szene). Wenn Sie eine Szene Hierarchie, es sind viele "stacked" - Modell-Matrizen für ein Objekt (Platzierung des Schwertes relativ zu einem arm, der arm relativ zu einem Ritter, Ritter, relativ zu der Szene).
Dann verwandeln Sie die Koordinaten in eye-space durch Multiplikation mit einem - view-matrix (meistens verbunden mit einem "Kamera" - Objekt).
Danach, mit einem Projektions-matrix verwandeln Sie diese coords auf dem Bildschirm Platz, so dass die OpenGL-Karte würde diese coords auf tatsächliche Pixel (abhängig von der viewport-Einstellung).
Einige Fakten:
Modell-und view-Matrizen enthalten in der Regel translation, rotation und/oder Skalierung, während die Projektions-matrix enthält in der Regel eine Perspektive der transformation, die macht der Objekte, die sich weiter vom Bildschirm kleiner erscheinen.
Alten OpenGL (2.x und früher) erforderlich, um die Matrizen auf beiden "matrix-stacks:
Diese könnten genauso gut einzelne Matrizen nicht stapeln, aber der Stapel (zusammen mit
glPushMatrix
undglPopMatrix
) wurde eingeführt, damit der Programmierer "speichern" und "laden" Sie leicht. Nur die "oberste" matrix aus jedem Stapel in Berechnungen verwendet wird.Die Projektions-matrix wird normalerweise erstellt, mit
gluPerspective
oder gleichwertig. Die view-matrix kann mitgluLookAt
(oder ähnlich Modell-Matrizen), und die Modell-Matrizen können leicht montiert werden mitglTranslate
,glRotate
undglScale
.(Hinweis: OpenGL 3.1+ entfernt diese Funktionen, so dass Sie alle Matrizen und alle Konventionen, die Sie bevorzugen)
Wissen, dass:
Einer angemessenen Art und Weise zu berechnen, die alle Ihre Physik ist, Sie zu tun in Szene Raum.
Daher, wenn Sie ein Modell (z.B. ein triangle mesh), um die position jeder seine Ecke im Szene Raum, müssen Sie Links multiplizieren Sie ihn mit nur das Modell ist Modell matrix (oder im Fall der Hierarchie, der sich durch alle seine Modell-Matrizen).
Über
gluProject
im Fall Sie sich schon gefragt - es ist eine bequeme Methode, die es Ihnen ermöglicht, sich zu vermehren eine Reihe von Koordinaten, die durch die aktuellePROJECTION*MODELVIEW
und führt viewport-transformation, um zu sehen, wo es am Ende in Platz auf dem Bildschirm, undgluUnProject
macht es Umgekehrt.Ref: http://www.opengl.org/resources/faq/technical/transformations.htm
[0,w]x[0,h]x[0,1]
-box, die auch, was Sie vongluProject
und ingluUnProject
.larger z = deeper
.glPush/PopMatrix
wurde entfernt, irgendwo in OpenGL 3.x, so würden Sie nur deklarieren Sie eineuniform mat4
in Ihre shader und füllen Sie es mit was auch immer-matrix müssen Sie in den client-code. Wenn Sie mit der compatibility-Profil-und OpenGL-2-ära builtingl_ModelViewMatrix
variabel, Sie können noch erklären, Ihre eigenenuniform
s obendrein.Zusätzlich zu Kos' beantworten, Bedenken Sie, dass OpenGL ist keine Szene-management-Bibliothek. Es ist nur eine Zeichnung API zieht die Dinge auf den Bildschirm und dann vergisst Sie. Ebenso ist es nicht zu verstehen, was ein "Objekt" ist, es kennt nur Dreiecke und auch diese nicht erinnern können, nachdem Sie gezeichnet wurden. Noch nie gefragt, warum Sie machen die ganze Szene neu jeden frame?
So, um zu wissen, dass ein Objekt der absoluten position in der Szene, verfolgen die Transformationen selbst und berechnen seine position aus diese.