10 3D-Liniengraphik: "line3d.ss"
Note: This is documentation for the line3d.ss teachpack that goes
with the German textbook
Die Macht der
Abstraktion.
Dieses teachpack definiert Prozeduren für lineare Algebra und 3D-Rendering:
10.1 Szenen erzeugen
Der Aufruf 
(render-scene width height scene camera-matrix)erzeugt die Szene
in ein Bild mit Breite 
width und Höhe 
height. Position,
Orientierung und Projektion werden durch die 
camera-matrix festgelegt.
Der Aufruf 
(create-camera-matrix position lookat vertical-fov width height)
erzeugt eine 4x4 Matrix. Diese kodiert eine Kamera an der Position 
position, die
auf die Position 
lookat schaut.
vertical-fov bezeichnet das 
vertikale Feld der Szene.
Zum Beispiel:
10.2 3D-Vektoren
Ein 
3D-Vektor (Name: 
vec3) ist ein Record, der durch den Aufruf 
make-vec3 erstellt wird.
(make-vec3 x y z) erstellt einen Vektor (x,y,z).
 (add-vec3 a b) gibt die Summe von 
a und 
b zurück.
 (sub-vec3 a b) gibt die Differenz zwischen 
a und 
b zurück.
 (mult-vec3 a s) gibt den das Produkt von 
a und 
s zurück.
 (div-vec3 a s) gibt den das Produkt von 
a und dem Kehrwert von 
s zurück.
 | normQuad-vec3 : (vec3 -> number) | 
(normQuad-vec3 a) gibt die quadrierte Norm/Länge |a|² eines Vektors a zurück (Quadrat der Euklidischen Norm.)
(norm-vec3 a) gibt die Norm/Länge |
a| eines Vektors a zurück (Euklidische Norm.)
 (crossproduct-vec3 a b) gibt das Kreuzprodukt von 
a
und 
b zurück (einen Vektor der senkrecht auf 
a und 
b steht).
 10.3 4D-Vektoren
Ein 
4D-Vektor vec4 ist ein 4D-Vektor. Folgende Prozeduren werden bereitgestellt:
(make-vec4 a b c d) erzeugt einen Vektor aus 
a, 
b, 
c und 
d.
 (add-vec4 a b)  gibt die Summe von 
a und 
b zurück.
 (sub-vec4 a b) gibt die Differenz zwischen 
a und 
b zurück.
 (mult-vec4 a s) gibt den das Produkt von 
a und 
s zurück.
 (div-vec4 a s) gibt den das Produkt von 
a und dem Kehrwert von 
s zurück.
 (dotproduct-vec4 a b) gibt die quadrierte Norm/Länge |
a|² eines Vektors 
a zurück (Quadrat der Euklidischen Norm.)
 | normQuad-vec4 : (vec4 -> number) | 
(normQuad-vec4 a) gibt die quadrierte Norm/Länge |a|² eines Vektors a zurück (Quadrat der Euklidischen Norm.)
(norm-vec4 a) gibt die Norm/Länge |a| eines Vektors a zurück (Euklidische Norm)
 (expand-vec3 a s) gibt den 4D-Vektor mit 
s als letze Komponente zurück (erweitert 
a mit 
s).
 10.4 4x4 Matrizen
Eine 
Matrix matrix4x4 ist ein Record, der durch den Aufruf 
make-matrix4x4 erstellt wird.
(create-matrix4x4 a b c d) erweitert jeden Vektor in einen 4D-Vektor und kombiniert diese zu
einer Matrix 
a, 
b, 
c und 
d, wobei
a, 
b, 
c mit 0 und 
d mit 1 erweitert wird, um eine homogene Matrix zu erzeugen.
 (transform-vec3 m v) erweitert 
v mit 1, multipliziert 
m mit 
v und dividiert das Ergebnis mit 
w.
 (create-lookat-matrix pos lookat up) gibt eine Kameramatrix. Ursprungspunkt ist 
pos, die Z-Achse zeigt auf 
lookat.
 (create-projection-matrix vertical-fov/2) erzeugt eine Projektions-Matrix. 
vertical-fov/2 gibt den vertikalen Winkel der Ansicht dividiert durch 2 an.
 10.5 3d-Linien
Eine 
3d-Linie line3d ist ein Record, der durch den Aufruf 
make-line3d erstellt wird und eine farbige Linie zwischen zwei Punkten
     im 3-dimensionalen Raum darstellt.
(make-line3d a b col) erstellt eine 3D-Linie zwischen Punkt 
a und Punkt 
b mit der Farbe 
col.
 extrahiert den Anfangspunkt einer 3D-Linie.
extrahiert den Endpunkt einer 3D-Linie.
extrahiert die Farbe einer 3D-Linie.
| create-box : (number number number color -> (list-of line3d)) | 
(create-box width height depth color) erstellt eine Box am Punkt (0,0,0) in den angebenen Ausmaßen.
 (transform-primitive-list scene transformationr) wendet 
transformation auf alle Punkte der Linien in 
scene an und gibt
       diese zurück.