Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 23:58

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Aug 22, 2015 01:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

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.. :(

Code:
  1. Point3D getPointOnNearClippingPlane(Point3D worldPos) {
  2.   // ...? :D
  3. }


Kann mir jemand auf die Spruenge helfen? :)

Danke!
Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 11:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
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:
  1. P'  = C + (P-C) * f/(P.z-C.z)
  2. 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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 11:37 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Hessesche Normalform ?
Point-Plane-Distance


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 13:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Das was ihr beide sagt funktioniert aber nur für Orthpgonale cameras, oder?

Ich brauche es für perspektivische projektion.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 13:18 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Vorher umrechnen und dann zurückrechnen?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 13:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
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:
  1. P'  = C + (P-C) * f/distance(P,C)
  2. 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.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 13:51 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Hmm, ich denke nur orthogonal. :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Aug 22, 2015 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Sorry, die letzte Version ist auch falsch, wie mir gerade aufgefallen ist. Nächster Versuch:
Code:
  1. P'  = C + (P-C) * f/dot(P-C, D)
  2. 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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Aug 23, 2015 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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.

Danke~
Aya


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 18:04 
Offline
DGL Member

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 :P


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 19:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Oh sorry, ich hab vergessen gehabt zu sagen das ich es hinbekommen habe :)

Code:
  1. CIPoint projectToZDepth(CIPoint pt, float depth)
  2. {
  3.     pt.w = 1.0f;
  4.     pt *= modelviewMatrix;
  5.     pt *= projectionMatrix;
  6.     pt /= pt.w;
  7.  
  8.     pt.w = 1.0f
  9.     pt.z = depth;
  10.     pt *= inverseProjectionMatrix;
  11.     pt *= inverseModelviewMatrix;
  12.     return pt / pt.w;
  13. }

Ich weiss nicht ob das die optimalste/schnellste loesung ist, aber es funktioniert einwandfrei.. in sofern passt es fuer mich erstmal :)

Danke,
Aya


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.161s | 19 Queries | GZIP : On ]