Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phili

unregistriert

1

07.08.2007, 23:20

Perspektivische Projektion

Ich hab ein logisches Problem bei der Berechnung einer Perspektivischen Projektion.
Im Endeffekt bestünde die bei einer Kamera am Punkt (0 0 0), einer Blickrichtung entlang der Z-Achse und einem Blickwinkel von 90° nur in einer Teilung der x- und y-Koordinaten eines Jeden Punktes durch seine z-Koordinate.
Das funktioniert auch ganz wunderbar, so lange alle Objekte vor der Kamera liegen. Sobald aber ein Dreieck zum Teil vor, und zum Teil hinter der Kamera liegt, gibt es bei mir Probleme. Ein Beispiel:
Die Kamera befindet sich am Ursprung(0|0), Blickrichtung (0|1).
Neben ihr ist eine Wand, sie besteht aus 2 Punkten
(1|2) und (1|-2). Diese Wand sollte jetzt eigentlich so etwa das rechte Viertel des Bildes ausfüllen.
Bei der perspektivischen Projektion kommt aber was ganz anderes raus:
1/2=0.5 1/-2=-0.5. D.h die Mitte des Bildes wäre von der Wand ausgefüllt.
Ich hoffe ihr konntet mir folgen und habt eine Ahnung, wo mein Problem liegt... (und wie man es umgehen kann)

//Edit: Das Beispiel ist in 2D, deswegen ist die Wand nur ein Strich und die Vektoren werden durch ihre y-Koordinate geteilt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

08.08.2007, 10:26

Ne konnte nicht folgen... Irgendwie fehlen mir da ein paar Koordinaten! :-)
@D13_Dreinig

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

08.08.2007, 13:10

1. Wie kann eine Wand aus nur 2 Punkten bestehen??
2. Wieso teilst du bei der Projektion die x Koord durch die y? (Impliziert: Wo ist die z-Koord?)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Phili

unregistriert

4

08.08.2007, 14:08

Hätt ich vieleicht explizit dazuschreiben sollen: Ich hab das ganze im Beispiel auf 2D reduziert. Das sollte die meisten Fragen klären. Die wand ist also im Endeffekt nen Strich.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

08.08.2007, 14:21

2D Beispiel? Ahja... Und daraus resultieren zwei 1 Komponenten Vektoren => a(0.5) und b(-0.5). Und wie trägst du die in eine 2D Ebene ein? Lassen wirs doch lieber bei drei Dimensionen. Da hast du deinen Punkt P mit den homogenen Koordinaten (x,y,z,1), dieser Punkt P wird transformiert in den clipspace und hat daraufhin die (homogenen) Koordinaten (x',y',z',w'). Jetzt brauchst du die Koordinaten als affine Koordinaten im device space (dein Bildschirm), diese bekommst du durch die Division mit der 4. Komponente des Vektors: (x'', y'', z'') = (x'/w', y'/w', z'/w') und schon hast du deine Bildschirmkoordinaten x'' und y'' (allerdings in den Bereich -1 und 1 gemappt). Die 3. Komponente z'' kannst du dann verwenden um den Z-Buffer zu füllen.
@D13_Dreinig

Phili

unregistriert

6

08.08.2007, 14:30

Ein 2D-Beispiel wird natürlich nicht auf eine Ebene sondern auf eine Linie eingetragen...
Die Funktionsweise eines Z-Buffers usw. ist mir auch durchaus schon bekannt, ich arbeite ja schon länger an einem Software-Renderer.

Aber ich kann das Problem auch mal in3D beschreiben.
Kamera bei (0 0 0), Blickrichtung (0 0 1).
Wand bestehend aus(1 -1 2), (1 1 2), (1 -1 -2) und (1 1 -2).
Transformation in das Koordinatensystem der Kamera entfällt da Kamera am Ursprung.
Multiplikation mit Projektionsmatrix (90° Blickwinkel) und Teilung durch W-Koordinate. Das entspricht zusammen der Teilung durch die Z-Koordinate.
Und dann hab ich immernoch das gleiche Problem:
Eigentlich sollte das rechte Viertel des Bildes Mit der Wand ausgefüllt sein, die Transformierten Punkte sind aber:

(0.5 -0.5) (0.5 0.5) (-0.5 0.5) (-0.5 -0.5)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

08.08.2007, 14:40

Jo, is ja auch korrekt! :) Du verlierst ja die Z Position des Punkts und alles wird bei dir einfach auf die positive Seite gebracht. Die Punkte P1(1,-1,-2) und P2(1,1,-2) entsprechen ja den Punkten P1'(-1,1,2) und P2'(-1,-1,2), bei deiner Rechnung. Drum musst du in deiner Rechnung mit berücksichtigen ob die Z-Koordinate im negativen Bereich liegt. Oder lieg ich jetzt ganz falsch?
@D13_Dreinig

Phili

unregistriert

8

08.08.2007, 14:42

Ja, schätz ich auch, dass ich irgendwie Berücksichtigen muss, ob die z-Koordinate im negativen Bereich liegt. Ich hab nur ka wie...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

08.08.2007, 14:48

Schaumal hier: http://www.cs.kuleuven.ac.be/cwis/research/graphics/INFOTEC/viewing-in-3d/node7.html
http://www.cs.kuleuven.ac.be/cwis/research/graphics/INFOTEC/viewing-in-3d/node8.html
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

08.08.2007, 14:53

Z kann gar nicht negativ werden. Das Clipping verhindert das (vor der Division!).

Werbeanzeige