OpenGL - Koordinaten umrechnungs problem :(
Übersicht

PhillipKBetreff: OpenGL - Koordinaten umrechnungs problem :( |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho, mal wieder (und wieder..und wieder..) ich ![]() Ich verzweifele grade echt an unzureichenden Mathekenntnissen. Mein vorhaben ist einfach: Ein objekt (2D) mit 4 eckpunkt-koordinaten zeichnen. Diese daten sind immer gleich und werden mit glTranslated versetzt gezeichnet (Das ganze soll pur OpenGL sein!) nun, das hat auch ganz gut geklappt. Meine Kollisionsberechnung lief auch super, meine Dominosteine sind der reihe nach umgefallen ![]() Beim versuch, das ganze um einen Drehpunkt zu erweitern, bin ich auf mein problem gestoßen: Seit geschlagenen 5 stunden versuche ich nun schon, die tatsächlichen Weltkoordinaten zu errechnen, um eine LineIntersect() funktion damit durchzuführen (meine Kollision halt ![]() BlitzMax: [AUSKLAPPEN] glPushMatrix() Das ist ein stück vom Zeichnen. alles kein Thema Self.x und Self.y beschreiben den 'Origin' meines objekts. Self.drehpunkt[0] und Self.drephunkt[1] bezeichnen den Drehpunkt, den ich einbauen möchte. Das sieht auch alles ganz super aus ![]() Solangsam bin ich echt ratlos.. Meine mathekenntnisse sind einfach zu spärlich, aber aufgeben möchte ich auch nicht ^^ Vielleicht ist das allerdings auch ein komplett falscher ansatz - kann mir jemand auf die sprünge helfen? ![]() Also zusammengefasst: Ich habe ein Origin, liegt in der mitte des Objekts. Ich habe einen Koordinate, die als Offset für die drehungs-verschiebung diehnt. Gezeichnet siehts perfekt aus. Ich habe 4 Eckpunkte meines Objekts, durch je eine X und eine Y koordinate beschrieben. Von diesen objekten existieren mehrere und ich möchte die linien zwischen den Eckpunkten berechnen, um diese per LineIntersect() auf schneidungen zu prüfen. Alle bisherigen versuche waren nur blindes probieren, ohne wirkliche ahnung. Kann mir jemand einen denkanstoss geben, ob mein vorhaben sinnig ist und wenn ja, in welcher reihenfolge ich WIE mit den koordinaten und offsets arbeiten muss? :3 Bzw, gibt es eventuell eine einfachere methode, Brauchbare koordinaten für LineIntersect zu erhalten bzw generell eine andere Kollisionsabfrage (wichtig ist mir, das ich die Kollisionskoordinaten erhalte - darum die intersect funktion!) Gruß, ein verzweifelter Phillipk :3 |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was mir gerade auffällt: Was meinst du mit "Origin" eines Objektes, und was mit dem "Drehpunkt"?
Üblicherweise reicht es doch, glTranslated für die Verschiebung des Objektes zur Position desselben aufzurufen und dann "das lokale Koordinatensystem zu drehen" (mit glRotated). Wieso brauchst du dann zwei Punkte? |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nunja, das ganze ist der beginn einer steilen lernkurve ![]() Ich versuche grade eine Art domino-geschubse zu schreiben. Hierzu habe ich ein paar steine in reihe, die auch wunderbar umfallen ![]() Da ich aber gleich das ganze etwas allgemeiner schreiben wollte, wollte ich zusätzlich den puntk angeben, um den sich das ganze dreht. Andererseits müsste ich meines erachtens alle koordinaten um den Drehpunkt-offset verschieben, sodass es immernoch korrekt aussieht. Zugegeben, so könnte ich wieder mein altes kollisionsystem nutzen ![]() ![]() Hier mal eine kleine Bebilderung :3 |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, das meintest du mit Mittel- und Drehpunkt. Grundsätzlich müsstest du also das Koordinatensystem so verschieben, dass der Drehpunkt auf (0,0,0) ist, dann drehen, zurückverschieben und dann erst die Translation zum Mittelpunkt vornehmen. Das wäre dann so etwas:
Code: [AUSKLAPPEN] glTranslated(-Self.drehpunkt[0],-Self.drehpunkt[1],0)
glRotated(...) glTranslated(Self.drehpunkt[0],Self.drehpunkt[1],0) glTranslated(Self.X,Self.Y) Alle Angaben ohne Gewähr. ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oh halt, nicht falsch verstehen ![]() Die drehung ist visuell schon genau am drehpunkt vorgenommen. Allerdings kann ich danach nichtmehr die wirkliche Raumkoordinate errechnen (also meiner Vertices ![]() Ansonsten werde ich zur not die koordinaten so verschieben, das der mittelpunkt gleichzeitig auch der drehpunkt ist.. Dafür muss ich aber, ungewollterweise, die Vertex-Koordinaten-positionen abändern ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du nicht selbst die Transformationen nachrechnen möchtest, kannst du die Modelview-Matrix auslesen und damit weiterrechnen. (Wie weit ist dein Kenntnisstand bei linearer Algebra? -> Multiplikation von Matrix mit Vektor)
Der nötige Befehl: glGet Die nötigen Informationen zum Aufbau der Matrix: http://www.songho.ca/opengl/gl...#modelview mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Chrm. Mein kenntnisstand ist gleich null.
Aber ich bin gerne gewillt zu lernen, solang ich weiß, nach welchen Stichworten ich suchen muss ![]() Das ich da was "auslesen" kann, wusste ich nicht. Matricen waren mir ebenfalls immer ein fremdwort. ich weiß zwar, das die Matrix dafür sorgt, das ich alles vernünftig sehe, aber wie sie genau fungiert, kann ich nicht sagen.. Lineare algebra, nie gehört. Scheint, ich habe für morgen früh mächtig lernstoff ![]() ![]() Ich werd morgen mal reinschauen. Bis dahin hoffe ich, das noch ein-zwei ansatzvorschläge (oder stichworte zur Matrizen rechnung ![]() Gute nacht und schonmal ein Dankeschön ![]() Lg, PhillipK |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gute Stichworte sind schon einmal "Matrix Tutorial". ![]() Kurzbeschreibung zum Thema Matrix: Eine Matrix ist sozusagen eine Zahlenkolonne in Tabellenform. (Vergleiche mit dem Vektor als Zahlenliste!) Dabei hat eine m x n bzw. "m Kreuz n"-Matrix m Zeilen und n Spalten. (Damit kann man Vektoren auch als mx1- oder 1xn-Matrizen interpretieren.) Mit Hilfe von Matrizen lassen sich Übergänge von n Werten auf m Werte darstellen. ein Beispiel: Eine Produktionskette mit 3 verschiedenen Ausgangsstoffen und 2 möglichen Endprodukten lässt sich über eine 3x2-Matrix beschreiben. Die Matrix Beschreibt dabei die Abhängigkeit der Kosten von der herzustellenden Menge an Produkten. Code: [AUSKLAPPEN] (1 2)
(1 0) (0 3) (Kosten von Produkt 1: 1x Stoff 1, 1x Stoff 2, 0x Stoff 3 -- Kosten von Produkt 2: siehe 2. Spalte) Wenn man nun 1x Produkt 1 und 2x Produkt 2 herstellen möchte, kann man das über eine Multiplikation von der Matrix mit einem Vektor darstellen. Code: [AUSKLAPPEN] (1 2) (1)
(1 0)*(2) (0 3) Das Ergebnis ist ein Vektor mit 3 Einträgen. (Es gibt ja auch 3 Ausgangsstoffe.) Code: [AUSKLAPPEN] (1 2) (1) (?)
(1 0)*(2)=(?) (0 3) (?) Für den ersten Ergebniseintrag nimmt man die erste Matrixzeile und die erste (und einzige) Spalte des Vektors. Dann multipliziert man die jeweils ersten Einträge miteinander, dann die jeweils zweiten. (Das würde bei größeren Beispielen so weiter gehen.) Die Produkte werden addiert und ergeben damit die benötigte Menge an Stoff 1. Code: [AUSKLAPPEN] (1 2) (1) (1*1+2*2)
(1 0)*(2)=(?) (0 3) (?) Für den zweiten Ergebniseintrag wird die zweite Zeile der Matrix und die erste (und immer noch einzige) Spalte des Vektors genommen. Mit beiden wird wie beim anderen Paar vorgegangen. Entsprechend wird auch der letzte Eintrag berechnet. Code: [AUSKLAPPEN] (1 2) (1) (1*1+2*2) (5)
(1 0)*(2)=(1*1+2*0)=(1) (0 3) (1*0+2*3) (6) Die Gesamtkosten betragen also: 5x Stoff 1, 1x Stoff 2 und 6x Stoff 3 Ich hoffe, dass dir das einen kleinen Einblick gab. ![]() mfG mpmxyz PS: Das und das sehen nach etwas aus. (in englischer Sprache) PPS: Der Begriff des Vektors ist dir bekannt? Ansonsten hast du noch mehr Stoff zum Nachforschen. ![]() |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hui, bin grade ganz verpallert ausm bett gestiefelt und nun sowas ![]() Nunja, vektor ist ein begriff, den ich mir selbst erarbeitet habe. Ich kann immernochnix mit dem vollen Funktionsumfang anfangen, aber ich habe mich schonmal eingearbeitet (damals gings um einen 3D raum und realistische Abprall-bewegungen von objekten mit bewegungsvektor) Nunjut. Kaffe ist gemacht, dann mal auf ans werk. Alles werde ich eh nie verstehen, zumindest nicht auf anhieb. aber solang ich mir am ende wenigstens grob was vorstellen kann, ist es nicht umsonst ![]() Edit: Huch, bereits nach einem bisschen stöbern bin ich bereits auf einen Lösungsansatz gestoßen. Die DGL Wiki und einer der gegebenen Tutorial-Links haben mir das Thema ein wenig näher gebracht. Da mein kaffe aber grade alle ist und ich noch nicht den elan verspüre, aufzustehen und mir einen neuen zu holen, werde ich ein wenig rumspielen. Mein vorhaben: Da ich nun ein paar ansätze habe, wie die Matrizen in OGL funktionieren, werde ich mal versuchen, mein vorhaben 2x zu zeichnen. einmal mit einer Nullmatrix und selbst errechneten punkten (Das, was durch die Matrix multipliziert, addiert etc wird ![]() Das klingt alles komplexer als es ist, habe ich recht? Wenn man sich traut und mal ein wenig stoff an die Birne lässt, kommt ziemlich schnell zu einem ergebnis ![]() |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mhh, wieder mal festgefahren.
Ich habe versucht, pro objekt was ich zeichne (jedes 4 vertices!) nach der verschiebung die matrix zu speichern. Nach dem "alten" zeichnen wollte ich nun händlich, wie in den Tutorials vorgeführt, meine XYZ koordinaten ausrechnen. An sich kein thema, hab den kleinen hinweis beachtet, das Matrizen in OGL spaltenweise gespeichert werden, nicht zeilenweise - hier meine rechnungen ^^ BlitzMax: [AUSKLAPPEN] 'Versuch 2: Die vertexposis direkt errechnen! xO , yO, zO, wO beschreiben die "alten" werte - x und y lese ich aus meinem array aus, Z ist immer 0 und w ist immer 1. Das ist grade in den letzten 3minuten entstanden, also bitte nicht Tadeln ![]() Hier einmal die passage aus dem Tutorial, welche die eigentliche rechnung der positionen beschreibt: Zitat: ![]() Code: [AUSKLAPPEN] x_neu := x*a[1,1] + y*a[1,2] + z*a[1,3] + w*a[1,4]
{Koeffizienten aus der ersten Zeile der Matrix} y_neu := x*a[2,1] + y*a[2,2] + z*a[2,3] + w*a[2,4] {Koeffizienten aus der zweiten Zeile der Matrix} z_neu := x*a[3,1] + y*a[3,2] + z*a[3,3] + w*a[3,4] {Koeffizienten aus der dritten Zeile der Matrix} w_neu := x*a[4,1] + y*a[4,2] + z*a[4,3] + w*a[4,4] {Koeffizienten aus der letzten Zeile der Matrix} An sich kann ich hier keinen fehler entdecken ![]() Was mich mal intressieren würde, mit welchem Matrix Mode zeichne ich nun eigentlich? Ich wurde derletzt dafür getadelt, das ich ausversehen die MODELVIEW matrix geladen hatte, wärend ich gezeichnet hatte. Nun nutze ich aktiv die Projektionsmatrix und weiß auch garnicht, warum ich umstellen sollte-könnte-müsste -> es ist doch alles sichtbar ![]() Nungut, gespielt habe ich trotzdem: Wenn ich per BlitzMax: [AUSKLAPPEN] glGetDoublev(GL_PROJECTION_MATRIX, Varptr(matrix[0])) mir die matrix besorge, erhalte ich in dem Print folgendes: (hier gleich die ersten 4 vertices, welche ein Objekt umfassen) Zitat: X: -0.199218750 Y: -0.184782594 Z: -1.00000000 W: 1.00000000
X: -0.199218750 Y: -0.293478251 Z: -1.00000000 W: 1.00000000 X: -0.191406250 Y: -0.293478251 Z: -1.00000000 W: 1.00000000 X: -0.191406250 Y: -0.184782594 Z: -1.00000000 W: 1.00000000 Mh, die verschiebungen sehen nun gänzlich nicht nach "sichtbar" aus, die meisten unterschiede finden sich erst in der 2ten nachkomma stelle. Wo liegt der fehler? Wie misshandle ich die Modelview matrix, damit sie für mich arbeitet? Muss ich evtl bevor ich die glTranslated() und glRotated() befehle ausführe ersteinmal auf MODELVIEW umschalten? :3 Hoffe auf antworten, ich bin weiter recherchieren *g* Edit 27.07.11 - 06:35: Oh... oooh... oh ehm.. äh? Verwirrt! Wie du, mpmxyz, bereits geschrieben hast, soll ich die Modelview - matrix auslesen. Alles klärchen, gesagt getan. Brachte nix, komische werte, aber alle steine am selben fleck. Tja was tun - mit meinen ersten versuchen hatte ich eh schon die modelview-matrix "genutzt" und meine Translationen etc darauf angewedent. Es wurde alles völlig normal gezeichnet. aber chrm - hä? ![]() Wenn das so falsch war, was ich nun auch geringfügig nachvollziehen kann, wieso klappt es dann, wenn ich die Modelview matrix lade und dort die translationen und die rotation drauf anwende, sie DANACH auslese, meine neuen werte errechne und das ganze zeichne? achgott, was für ein mist. Doch nicht so einfach wie gedacht. Fakt ist, das ich das ganze verstehen möchte. Ich wollte nur ungern für jedes objekt die matrix auslesen und die werte händlich errechnen. Edit: 27.07.11 - 09:44: Um einen weiteren doppelpost zu vermeiden, editier ich hier meinen "fortschritt" rein. Das ganze sieht schon ganz gut aus. Der drehpunkt wird korrekt verwendet und die zeichnungen stimmen. Koordinaten lassen sich, dank matrix, nun umrechnen. Das sieht im groben so aus, das ich meine objekte um ihre eigene Matrix erweitert habe. Sie halten nun ein field, in welchem ich die zuletzt berechnete Matrix halte, welche ich bei bedarf auslesen kann. Das zeichnen habe ich erstmal via Modelview matrix gelassen, da ich keine vorstellung habe, was das für auswirkungen haben könnte. Aber dennoch hoffe ich hier eine kleine hilfestellung zu erhalten :3 Durch die fähigkeit, meine Koordinaten nun korrekt in linien umzuformen, bin ich nun in der lage, die LineIntersect funktion darauf anzuwenden. Geplant ist ein logisches anstoßen - Sollte ein Dominostein einen andereren berühreren, so habe ich, dank LineIntersect, die möglichkeit, die Position der kollision rauszufinden. Nun das ganze ist nun nicht grade das genauste, aber immerhin isses SAUMÄßIG schnell ![]() ![]() (diese funktion habe ich ausm codearchiv! nur so als hinweis ^^ habe sie weiter oben Fälschlicherweise als 'meine' betitelt ![]() Hier einmal ein part aus meinem Type (TStein) BlitzMax: [AUSKLAPPEN] Type TStein Dort ist das auslesen der Matrix im DrawPart und meine Debugmethode 'DrawCollRect()' zu sehen. DrawCollRect multipliziert meine PositionsVektoren mit der vorher gespeicherten Matrix, um die selbe "position auf dem screen" zu erhalten.. Wird für die noch kommende LineIntersect prüfung genutzt. Wenn ich das soweit habe, bin ich in der lage anhand der Vertices, der stoßposition und sonstigen scherzen den Drehpunkt zu setzen. Dies erstmöglicht ein Realistisches umstoßen und ich bin meinem ziel ein gutes stückchen näher! |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich sehe, dass du dich mit dem Thema intensiv beschäftigst. ![]() Da ich nicht weiß, welche Fragen noch offen stehen, beantworte ich die, die mir auffallen: Welche Matrix modifizierst du mit "glOrtho"? Das sollte die Kameramatrix sein. (Da kommt aber auch nicht mehr, da diese nur für die Kameraeigenschaften zuständig ist!) Die restlichen Transformationen kommen dann wie gehabt in die Modelview-Matrix. Beim glOrtho-Aufruf kannst du die Dimensionen deines Bildschirmkoordinatensystems einstellen. Das OpenGL-Bildschirmkoordinatensystem geht von -1 bis +1. -> Da glOrtho dafür sorgt, dass dein Koordinatensystem in das OpenGL-Koordinatensystem ungewandelt wird, bekommst du, wenn du glOrtho in der Modelview-Matrix verwendest, entsprechende Koordinaten im Bereich von -1 bis +1. Daher kommt auch dein "Werte falsch - Zeichnen funktioniert"-Problem. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dann komme ich nicht so ganz mit oÔ
Die Projektionsmatrix wird von glOrtho beeinflusst. Egal was ich danach mache, meine objekte werden normal gezeichnet (ob nun Modelview aktiv ist oder Projections, scheint egal zu sein) Die werte die errechnet werden, sind in einer spanne von -(ResX/2) und ResX/2, sowie -(ResY/2) und ResY/2, da ich, mit den beiden konstanten ResX und ResY für Resolution, den viewport mit dem koordinaten urpsrung 0/0 auf die bildschirmmitte ausrichte. Man muss dazusagen, das ich mich noch nicht soo lange mit OGL beschäftige ![]() Nunja, das umrechnen der Koordinaten via matrix funktioniert ganz gut. Im moment setze ich die Transformationen, rotationen und weitere Transformationen jedesmal in einem drawaufruf. ist dies geschehen, speicher ich die Matrix zwischen. Daraus lassen sich nun in meinen Kollisionsabfragen eindeutige koordinaten errechnen. Soweit funktioniert alles. Was mir grade zu schaffen macht, ist die Modelviewmatrix ![]() Also, wenn ich das richtig verstnanden habe, programm initialisierung -> BlitzMax: [AUSKLAPPEN] Function StartOrthoGL(Width:Int, Height:Int, depth:Int = 0, hertz:Int = 60) Egal welche matrix aktiv ist, es wird immer korrekt gezeichnet. Nur das händliche nachrechnen wird käse, wenn ich die Projektionsmatrix auslese oder translate. oÔ Das ist ein punkt, den ich nicht verstehe ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jede Matrix wird benutzt. Man kann ihre Wirkung nicht deaktivieren. (Es sei denn, du setzt sie mit glLoadIdentity auf die Einheitsmatrix. ![]() Die Aktivierung über glMatrixMode bewirkt nur, dass du diese Matrix ab nun ändern kannst. Die beiden Matrizen, die du kennst, werden so verwendet: Ausgangsvektor (Objektkoordinaten) --Modelview-Matrix (beschreibt Position und Rotation von Kamera und Objekt)--> globale Koordinaten (das, was du haben möchtest) --Projektions-Matrix (beschreibt die Eigenschaften der Kameraprojektion (Zoom, Fluchtpunkte etc.)--> Kamerakoordinaten (durch eine Division durch die 4. Koordinate entsteht die eigentliche Perspektive) Aus dem Grund, dass man dann als Zwischenergebnis globale Koordinaten bekommt, sollte man glOrtho bzw. das "perspektivische" Gegenstück glFrustum in die Projektionsmatrix stecken und alle anderen Transformationen in der Modelview-Matrix verwenden. (-> Die Projektionsmatrix ändert sich in der Regel nicht.) Zu deinem Code: Das sieht ganz gut aus. Verstehe ich dich richtig, dass du an sich schon zu richtigen Ergebnissen gekommen bist, aber die von mir angesprochenen Sachen unklar waren? mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, soweit ist das richtig.
Ich habe durch rumspielen die richtigen koordinaten erhalten, nur nicht wirklich verstanden, wieso. Mein grundvorhaben ist allerdings immernochnicht verwirklicht - ich wollte eine tatsächliche kollision errechnen. Wenn ich alles ganz massiv händlich schreibe, gehts. In einer forschleife verschachtelt (jede linie von objekt A mit jeder linie von objekt B abgleichen) kommt murx bei raus. Das ganze habe ich heute ersteinmal zurückgestellt und versuche eine kleine idee für den BCC umzusetzen. Da ich den beitrag allerdings auch in OGL schreibe und mir dort schräge linien gut vorstellen könnte, werde ich auch dort evtl von der Technik der Matrizenrechnung gebrauch machen ![]() Man lernt nicht aus und OGL ist ein umfassendes Thema.. da bin ich sicher noch jahre mit am spielen ![]() Gruß, Phillipk ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group