ich habe einen punkt im 3D raum und moechte diesen gern auf die near und far clipping plane projezieren, allerdings hab ich grad einen knoten in meinem Kopf bezueglich der Mathematik dahinter..
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ist doch eigentlich nur Dreisatz, oder? Du hast deinen Punkt P, deine Camera C, die Abstände n und f der Ebenen zur Kamera.
Code:
P' = C + (P-C) * f/(P.z-C.z)
P'' = C + (P-C) * n/(P.z-C.z)
Oder meintest du was anderes?
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Also meine Lösung projeziert vom Kamerapunkt auf die Ebenen. Also wenn von der Kamera aus ein Laserstrahl in Richtung P geschossen würde, wären P' und P'' die Schnittpunkte mit den Ebenen. Edit: Meine Lösung oben rechnet nicht konsequent in Weltkoordinaten. Richtig müsste es so aussehen:
Code:
P' = C + (P-C) * f/distance(P,C)
P'' = C + (P-C) * n/distance(P,C)
Orthogonal wäre, wie von Jens angedeutet, den Punkt auf der Near-/Far-Ebene berechnen, der den kürzesten Abstand zu P hat.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Zuletzt geändert von glAwesome am Sa Aug 22, 2015 13:52, insgesamt 1-mal geändert.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Sorry, die letzte Version ist auch falsch, wie mir gerade aufgefallen ist. Nächster Versuch:
Code:
P' = C + (P-C) * f/dot(P-C, D)
P'' = C + (P-C) * n/dot(P-C, D)
Dabei ist D ein normalisierter Richtungsvektor, nämlich die Richtung, in die die Kamera blickt. dot(P-C, D) ist gleich distance(P,C) * cos(Winkel zwischen P-C und D), oder mit anderen Worten, der Abstand von P zur Kamera in Richtung der Kamera.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Konnte es leider noch nicht testen, aber irgendwie scheint mir das nicht 100% das zu sein was ich brauche... oder?
Ich hätte erwartet das es irgendwie mit der modelview und projektions matrix berechnet werden muss, ähnlich zu gluProject und gluUnProject..?
Das was ich möchte ist im Grunde das Gleiche als würde ich die welt koordinate via gluProject in den screenspace transformieren, und dann via gluUnProjet zurück in world space, mit einem z-wert von 0 (bzw nearClippingPlane). Nur das ich hoffe es direkter hinzubekommen, zumal ich durch die int-2D koordinaten präzision verliere.
Registriert: Mo Feb 15, 2010 18:09 Beiträge: 21
Programmiersprache: C++, Java
Ich glaube der richtige mathematische Ansatz hier wären die Strahlensätze.
Um das ganze mal zu vereinfachen beschränken wir uns auf 2 Dimensionen und wollen also nun etwas auf einen Streckenabschnitt statt einer Ebene projizieren.
Angenommen, du schaust aus dem Ursprung in positive Richtung der x-Achse. Dein "Bildschirm" also die near-plane sei die Gerade x=1. Für einen gegebenen Punkt (a, b) und projizierten Punkt (a', b') gilt nun nach dem Strahlensatz folgendes Verhältnis: a/b = a'/b'. Wir kennen nun a und b und a' = 1. Also können wir zu b' umformen: b' = a' * b / a. Das ist im Übrigen genau das, was glPerspective macht und der Grund warum später durch die w Koordinate geteilt wird, falls sich damit schonmal jemand genauer auseinander gesetzt hat. Rein mathematisch werden die Koordinaten dehomogenisiert, also aus dem projektiven Raum wieder in den affinen Raum zurück geholt.
In drei Dimensionen müss man das ganze für die x und y koordinate getrennt machen.
EDIT: Ein sehr schönes Thema, hätte ich mehr Zeit würde ich das ganze ausführlicher machen
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.