OpenGL - Koordinaten umrechnungs problem :(

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

PhillipK

Betreff: OpenGL - Koordinaten umrechnungs problem :(

BeitragDi, Jul 26, 2011 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho, mal wieder (und wieder..und wieder..) ich Smile

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 Very Happy

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 Very Happy)

BlitzMax: [AUSKLAPPEN]
		glPushMatrix()
glTranslated(Self.X, Self.Y, 0)

glRotated(Self.angle, 0, 0, 1)
glTranslated(Self.drehpunkt[0], Self.drehpunkt[1], 0)

glBegin(GL_QUADS)
For Local i:Int = 0 Until Len(Self.koordArr) Step 2
glVertex2d(Self.koordArr[i], Self.koordArr[i + 1])
Next
glEnd()
glPopMatrix()


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 Smile Nur leider kriege ich jetzt nichtmehr die koordinaten aus dem Self.koordArr so umgerechnet, das sie Weltkoordinaten entsprechen.

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? Sad

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

BeitragDi, Jul 26, 2011 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 26, 2011 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, das ganze ist der beginn einer steilen lernkurve Very Happy

Ich versuche grade eine Art domino-geschubse zu schreiben.

Hierzu habe ich ein paar steine in reihe, die auch wunderbar umfallen Smile Allerdings ist der "Drehpunkt" immer auf der unteren Kante, mittig gewesen.
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 Sad

user posted image

Hier mal eine kleine Bebilderung :3
 

n-Halbleiter

BeitragDi, Jul 26, 2011 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
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

BeitragDi, Jul 26, 2011 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh halt, nicht falsch verstehen Very Happy

Die drehung ist visuell schon genau am drehpunkt vorgenommen.
Allerdings kann ich danach nichtmehr die wirkliche Raumkoordinate errechnen (also meiner Vertices Very Happy), welche ich allerdings in meinem eingeschränkten wissen brauche, um kollisionen zu errechnen.

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 Sad

mpmxyz

BeitragDi, Jul 26, 2011 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 26, 2011 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Chrm. Mein kenntnisstand ist gleich null.
Aber ich bin gerne gewillt zu lernen, solang ich weiß, nach welchen Stichworten ich suchen muss Smile

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 Smile Solange ich mein problem gelöst kriege (welches ich mir selbst zu lernzwecken gestellt habe), habe ich auch motivation. Very Happy

Ich werd morgen mal reinschauen. Bis dahin hoffe ich, das noch ein-zwei ansatzvorschläge (oder stichworte zur Matrizen rechnung Wink ) hier reinflattern.. jetzt ruft erstmal das Bettchen.

Gute nacht und schonmal ein Dankeschön Smile

Lg, PhillipK

mpmxyz

BeitragMi, Jul 27, 2011 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute Stichworte sind schon einmal "Matrix Tutorial". Wink
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. Smile
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. Smile
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

PhillipK

BeitragMi, Jul 27, 2011 4:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hui, bin grade ganz verpallert ausm bett gestiefelt und nun sowas Very Happy

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 Smile

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 Very Happy) und einmal das bereits bestehende.
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 Smile
 

PhillipK

BeitragMi, Jul 27, 2011 6:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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!
Local x:Float, y:Float, z:Float, w:Float

glColor3f(1.0, 0.6, 0)

glBegin(GL_QUADS)

For Local i:Int = 0 Until 4
Local xO:Float = Self.koordArr[i * 2]
Local yO:Float = Self.koordArr[i * 2 + 1]
Local zO:Float = 0.0
Local wO:Float = 1.0

x = (xO * matrix[0]) + (yO * matrix[4]) + (zO * matrix[8]) + (wO * matrix[12])
y = (xO * matrix[1]) + (yO * matrix[5]) + (zO * matrix[9]) + (wO * matrix[13])
z = (xO * matrix[2]) + (yO * matrix[6]) + (zO * matrix[10]) + (wO * matrix[14])
w = (xO * matrix[3]) + (yO * matrix[7]) + (zO * matrix[11]) + (wO * matrix[15])

Print "X: " + x + " Y: " + y + " Z: " + z + " W: " + w
glVertex2d(x, y)', z)', w)
Next

glEnd()
glColor3f(1, 1, 1)


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 Very Happy

Hier einmal die passage aus dem Tutorial, welche die eigentliche rechnung der positionen beschreibt:

Zitat:
user posted image

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 Very Happy

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 Wink

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ä? Very Happy

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 Very Happy Ich brauche wieder Sqr, noch Sin, noch Cos, kein Atan2, nix. Nur simple Mathematik und abs Smile
(diese funktion habe ich ausm codearchiv! nur so als hinweis ^^ habe sie weiter oben Fälschlicherweise als 'meine' betitelt Surprised)

Hier einmal ein part aus meinem Type (TStein)
BlitzMax: [AUSKLAPPEN]
Type TStein
Field koordArr:Float[] = [- 2.5, -25.0, -2.5, 25.0, 2.5, -25.0, 2.5, 25.0]
Field drehpunkt:Float[] = [0.0, 0.0] 'der punkt, um den gedreht wird! später evtl ein index für einen der Vertixes.

Field X:Int = 0 'ZentrumX
Field Y:Int = 0 'ZentrumY

Field angle:Float = 0

Field lastMatrix:Double[] = New Double[16]

Method CheckCollision:Int(With:TStein)

End Method

Method Draw()
glPushMatrix()
glTranslated(Self.X, Self.Y, 0)

glRotated(Self.angle, 0, 0, 1)
glTranslated(Self.drehpunkt[0], Self.drehpunkt[1], 0)

'alles fertig!
glGetDoublev(GL_MODELVIEW_MATRIX, Varptr(Self.lastMatrix[0]))
'matrix sollte nun in Self.lastmatrix[] sein!

'Zeichnen des steins!
glBegin(GL_TRIANGLE_STRIP)
For Local i:Int = 0 Until Len(Self.koordArr) Step 2
glVertex2d(Self.koordArr[i], Self.koordArr[i + 1])
Next
glEnd()
glPopMatrix()
'Matrix ist zurückgesetzt!
End Method

Method DrawCollRect()
'Da dies die Collision Lines darstellt, rot einfärben!
glColor3f(1, 0, 0)

'locals, um sinnloses 'öfters erstellen' in der Forschleife zu vermeiden.
Local xO:Float, yO:Float, zO:Float = 0, wO:Float = 1
Local x:Float, y:Float

'Zeichnen!
glBegin(GL_LINE_LOOP)
Local i:Int = 0
For Local cnt:Int = 0 Until 4
'Temporäres vertauschen, da ich meine koordinatne umgestellt habe. Später entfällt dies:
i = cnt
If i = 2 Then
i = 3
ElseIf i = 3 Then
i = 2
End If
'/Temp tausch. Grund ist: Vertex 3 und 4 sind im index getauscht worden, LineLoop hat daraus ein haus vom Nikolaus gemacht :)

xO = Self.koordArr[i * 2] 'Holen der X koordinate aus dem eigenen Array!
yO = Self.koordArr[i * 2 + 1] 'Hole der Y koordinate aus dem eigenen Array!

' Matrix mit dem PositoinsVektor multiplizieren - glaube ich *g*
x = (xO * Self.lastMatrix[0]) + (yO * Self.lastMatrix[4]) + (zO * Self.lastMatrix[8]) + (wO * Self.lastMatrix[12])
y = (xO * Self.lastMatrix[1]) + (yO * Self.lastMatrix[5]) + (zO * Self.lastMatrix[9]) + (wO * Self.lastMatrix[13])

'punkt setzen!
glVertex2d(x, y)
Next
glEnd()
'Feddich, zurücksetzen bitte.
glColor3f(1, 1, 1)
End Method
End Type


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

BeitragMi, Jul 27, 2011 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe, dass du dich mit dem Thema intensiv beschäftigst. Smile
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

BeitragDo, Jul 28, 2011 4:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

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 Very Happy

Also, wenn ich das richtig verstnanden habe, programm initialisierung ->
BlitzMax: [AUSKLAPPEN]
Function StartOrthoGL(Width:Int, Height:Int, depth:Int = 0, hertz:Int = 60)
GLGraphics(Width, Height, depth, hertz) 'OpenGL fenster initialisieren - danke blitzmax! :)

glMatrixMode(GL_PROJECTION) ' Projektionsmatrix auswählen.
glLoadIdentity() 'Zurücksetzen der Matrix

glOrtho(-ResX / 2, ResX / 2, ResY / 2, -ResY / 2, 0, 128)

glMatrixMode(GL_MODELVIEW) 'Modelview Matrix auswählen. Möge das zeichnen beginnen!
End Function


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 Very Happy

mpmxyz

BeitragDo, Jul 28, 2011 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Jede Matrix wird benutzt. Man kann ihre Wirkung nicht deaktivieren. (Es sei denn, du setzt sie mit glLoadIdentity auf die Einheitsmatrix. Wink)
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

BeitragDo, Jul 28, 2011 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Man lernt nicht aus und OGL ist ein umfassendes Thema.. da bin ich sicher noch jahre mit am spielen Smile

Gruß, Phillipk Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group