Ãbungen zu den Lehrveranstaltungen 710.003 Computergrafik 1 ...
Ãbungen zu den Lehrveranstaltungen 710.003 Computergrafik 1 ...
Ãbungen zu den Lehrveranstaltungen 710.003 Computergrafik 1 ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Abbildung 20: Achsen des Worldspace (x, y, z) und z-Achse aus Kamerasicht (SightV ector)<br />
Es existiert bereits eine verschachtelte for-Schleife, die für Sie die Pixel des Ausgabebildes durchläuft.<br />
Die aktuelle Pixelposition wird durch das Paar (pixel_x, pixel_y) beschrieben. Konvertieren Sie also<br />
die horizontale Pixelposition pixel_x, im Bereich zwischen 0 und dim_x, <strong>zu</strong> einem horizontalen Abstand<br />
viewplane x mit einem Wert zwischen −1/aspect und 1/aspect, und speichern Sie das Ergebnis als<br />
Fließkommazahl. Die vertikale Pixelposition pixel_y soll <strong>zu</strong> einem Wert viewplane y zwischen 1 und −1<br />
konvertiert wer<strong>den</strong>. Beachten Sie bei bei<strong>den</strong>, dass der Strahl durch <strong>den</strong> Mittelpunkt der Pixel geschossen<br />
wer<strong>den</strong> soll!<br />
Wenn sie diese Werte viewplane x und viewplane y für <strong>den</strong> aktuellen Pixel berechnet haben, muss nur<br />
mehr der Strahl erstellt wer<strong>den</strong>. Verwen<strong>den</strong> sie dafür eine float3 und die nachfolgende Formel<br />
ray = viewplane x · x + viewplane y · y + f_z (17)<br />
Das Ergebnis muss noch normalisiert wer<strong>den</strong>, da die verwendeten Formeln <strong>zu</strong>r Schnittberechnung sonst<br />
ungültig sind. Rufen Sie danach die Methode shootRay mit der Startposition camera.eye, dem berechneten<br />
Strahl, der Objektliste shapes, der Lichtquelle light und dem Farbwert pixel_color auf.<br />
Wenn die Methode true retourniert, wurde ein Objekt getroffen und dessen Farbwert ist in pixel_color<br />
gespeichert. Sie können daraufhin einen Pixelwert R8G8B8A8 mit der berechneten pixel_color erstellen.<br />
Die Pixel können mit output_image_(pixel_x, pixel_y) addressiert wer<strong>den</strong>.<br />
Schnitt mit Dreiecken (3 Punkte) Überschreiben Sie die Methode findIntersectionPoints der<br />
Klasse Triangle, um die Kontrolle der Schnittpunkte für Dreiecke <strong>zu</strong> aktivieren. Als erstes muss der<br />
Schnittpunkt mit der Ebene gefun<strong>den</strong> wer<strong>den</strong>, die von dem <strong>zu</strong> testen<strong>den</strong> Dreieck aufgespannt wird. Benutzen<br />
Sie da<strong>zu</strong> die Methode MathUtils::rayPlaneIntersect. Als Parameter müssen der Startpunkt<br />
und der Vektor des Rays, sowie die Instanzattribute face_.plane_D und face_.normal_vector<br />
übergeben wer<strong>den</strong>. Bei einem normalisierten Ray ist der Returnwert s der Funktion die Distanz zwischen<br />
Schnittpunkt auf der Ebene und Startpunkt. Sollte diese Distanz