Ein Winkel im Dreieck..
-
Aalso ich habe folgendes Modell:
Eine Kamera fixiert im 3D-Raum den Koordinatenursprung.
Hier habe ich einen Winkel und einen Abstand. Die Höhe ist immer 0.Jetzt kommt ein Punkt dazu, der irgendwo im Raum liegt (X,Y,Z)
Um diesen nun zu projezieren muss ich genau was tun?
Eigentlich müsste ich doch die Koordinaten der Kamera von denen des Punkts abziehen, um die relative Position zwischen beiden zu bekommen?
Anschließend muss ich das Ganze noch projezieren./* Berechnung Kamerakoodinaten */ camX = sin (canAngle) * disposition; camY = 0; camZ = cos (camangle) * disposition; /* Berechnung der Relativen Position */ vt.x = point.x - camX; vt.y = point.y - camY; vt.z = point.z - camZ; /* Projektion der Position */ px = vt.x / (vt.z * tan(ÖffnungswinkelX)) * Bildschirmbreite; py = vt.y / (vt.z * tan(ÖffnungswinkelY)) * Bildschirmhöhe;
Dieser "Pseudocode" beschreibt das was ich tue.
Hat meine Cam nun einen Winkel von 90° hab ich Werte die irgendwo bei einigen Millionen liegen.
Ich bein mal grob der Meinung, dass die Rechnung so nicht richtig ist?Edit: Oookay.. cosinus 90° ist 0 und division durch 0 ist ungesund.. aaber irgendwie reparier ich das?
Hat jemand zufällig ne Korrekturhilfe für mich?
-
Bist Du sicher, daß Deine Projektionsgleichung stimmt? Ansonsten versuch doch mal zunächst in ein Standardmodell zu kommen. Kamera sitzt im Ursprung und schaut entlang der Z-Achse. Die Transformation, die Deine Kamera so verschiebt, daß Du im Standardmodell bist kannst Du einfach mal auf jeden Punkt loslassen, den Du projizieren möchtest. Dann befindest Du Dich vollständig in dem einfachen Koordinatensystem. Dort sollte sich die Projektionsgleichung dann auch einfach aufstellen lassen.
Wenn Du das alles mal von Hand machst kann es sein, daß sich die Gleichungen noch etwas vereinfachen lassen.
-
DocJunioR schrieb:
Aalso ich habe folgendes Modell:
Eine Kamera fixiert im 3D-Raum den Koordinatenursprung.
Hier habe ich einen Winkel und einen Abstand. Die Höhe ist immer 0.Jetzt kommt ein Punkt dazu, der irgendwo im Raum liegt (X,Y,Z)
Um diesen nun zu projezieren muss ich genau was tun?
Eigentlich müsste ich doch die Koordinaten der Kamera von denen des Punkts abziehen, um die relative Position zwischen beiden zu bekommen?
Anschließend muss ich das Ganze noch projezieren.Dieser "Pseudocode" beschreibt das was ich tue.
Hat meine Cam nun einen Winkel von 90° hab ich Werte die irgendwo bei einigen Millionen liegen.
Ich bein mal grob der Meinung, dass die Rechnung so nicht richtig ist?Edit: Oookay.. cosinus 90° ist 0 und division durch 0 ist ungesund.. aaber irgendwie reparier ich das?
Hat jemand zufällig ne Korrekturhilfe für mich?
dir fehlt noch die Kamerakonstante.
bei einem winkel von 90° projezierst du nicht mehr in die bildebene, weil die schnittgerade paralel zu dieser liegt.
die Abbildungsgleichung beim lochkamera model istR -Rotationsmatrix 3D Xbild=-c* ( R00(Xwelt-Xkamera) + R01(Ywelt-Ykamera) +R02(Zwelt-Zkamera) ) ----------------------------------------------------------- R20(Xwelt-Xkamera) + R21(Ywelt-Ykamera) +R22(Zwelt-Zkamera) Ybild=-c* ( R10(Xwelt-Xkamera) + R11(Ywelt-Ykamera) +R12(Zwelt-Zkamera) ) ----------------------------------------------------------- R20(Xwelt-Xkamera) + R21(Ywelt-Ykamera) +R22(Zwelt-Zkamera)
-
Eine Kamera fixiert im 3D-Raum den Koordinatenursprung.
Hier habe ich einen Winkel und einen Abstand. Die Höhe ist immer 0.Jetzt kommt ein Punkt dazu, der irgendwo im Raum liegt (X,Y,Z)
Um diesen nun zu projezieren muss ich genau was tun?
Kamera sitzt im Ursprung
ich würde die Kamera immer in den Ursprung legen. Deine Kamera hat ja eine Position und eine Rotation im R3. Aus diesen Daten bildest du einfach die Inverse Matrx und Multiplizierst alle Vertices mit dieser Matrix - nennen wir die Matrix einfach mal View-Matrix
(beim bilden der Inversen Matrix wird nicht großartig rumgerechnet (GaußAlog und Co), sondern man macht sich sein wissen zu Nutze: geht etwa so - wenn die Kamera auf der x-Achse um 10 einheiten verschoben wurde dann bekommen wird die inverse Matrix indem wir einfach wieder -10 einheiten verschieben, wurde die Kamera um die x-Achse um 30° gedreht, dann drehen wir einfach weider um -30° zurück, usw.)
Nun hast du alle Koordianten in Bezug auf das Kamerakoordinatensystem gegeben
nun kannst du wie folgt vorgehen:
http://people.fh-landshut.de/~jamann/PerspektivischeProjektion.pdfIch habe zum Software Rendering eine Mailingliste eingerichtet in der sich ein paar Leute tummeln, die so etwas schon einmal programmiert haben - wenn du willst kannst du dich ja dort auch anmelden
http://groups.yahoo.com/group/Software-Rendering/
-
[quote="Vertexwahn"]
...Inversen Matrix wird nicht großartig rumgerechnet (GaußAlog und Co), sondern man macht sich sein wissen zu Nutze: geht etwa so -...
Rotationsmatrizen sind orthogonal also ist die inverse gleich der transponierten und keiner rechnet irgendwas.
-
[quote="b7f7"]
Vertexwahn schrieb:
...Inversen Matrix wird nicht großartig rumgerechnet (GaußAlog und Co), sondern man macht sich sein wissen zu Nutze: geht etwa so -...
Rotationsmatrizen sind orthogonal also ist die inverse gleich der transponierten und keiner rechnet irgendwas.
@b7f7
loltoll jetzt könnte ich sagen "wenn eine Translation in der Matrix steckt, dann ist transponieren keine gute Idee"
wir meinen doch beide das gleiche
- was soll das rumgeflame
-
die Kamera auf den Nullpunkt zu legen geht leider nicht. Hab mehrere davon und die passen nicht alle an die gleichen Koordinaten.
Die Links schau ich mir gerade an :).
-
Du kannst doch jede für sich in den Nullpunkt legen. Am Projektionsergebnis ändert das nix, es ist nur leichter hinzuschreiben.
-
wenn eine Translation in der Matrix steckt, dann ist transponieren keine gute Idee
eigentlich egal, denn die position der kamera gilt im untransformierten (kartesischen) 3d-raum, der von der kameramatrix transformiert wird. die translation muss also lediglich mit in den kamera-raum uebertragen werden, was einer multiplikation mit sich selbst entspricht und deutlich angenehmer als allgemeine matrix-invertierung ist.