| ★ APPLICATIONS ★ CREATION GRAPHIQUE ★ CPC-GIGA-CAD (HAPPY COMPUTER) ★ |
Faszination in 3D![]() | Malen mit CPC-Giga-CAD![]() | Jetzt zeigt's CPC-Giga-CAD![]() | Die Schattierung — ein CPC-Giga-CAD-Schmankerl![]() |
Tiefenwirkung erzielen geeignete Schattenwürfe. Was für das menschliche Auge einfach zu sehen ist, das bedeutet für den Computer eine komplizierte Rechenaufgabe, die ihm nur schwer beizubringen ist. Die Qualität eines CAD-Programms zeigt sich an der Bildausgabe. Einfache Objekte lassen sich relativ leicht auf den Bildschirm (oder das Papier) zaubern. Daß solch ein Gebilde aber fast immer »unecht« wirkt, liegt an der meist unnatürlichen (weil fehlenden) Lichtquelle. Jedes Bild lebt nämlich auch von den Schatten, die der Gegenstand wirft, wenn er von einer einzigen Stelle aus angestrahlt wird. CPC-Giga-CAD ist deshalb mit einer sehr umfangreichen Schattierungsroutine ausgestattet. Alle Objekte werden als eine Ansammlung einzelner Flächen vom Computer verwaltet. Häufig definieren ähnliche 3D-Grafikprogramme nur die Kanten der Gebilde - also nur Strecken. Beim Ausblenden von verdeckten Linien bereitet diese Art aber große Schwierigkeiten, da ja ein Strich bekanntlich keinen Schatten wirft. Die hier benutzte Methode unterscheidet sich aber noch in einem anderen wichtigen Punkt von denen vieler Konkurrenten. Die Zahl der Eckpunkte ist nicht auf drei beschränkt. Sie dürfen jede Fläche aus »beliebig« vielen Eckpunkten zusammensetzen. Dies macht die Schattierungsroutine kompliziert und auch langsamer. Die Ausgabezeiten von CPC-Giga-CAD bleiben aber aufgrund der hohen Arbeitsgeschwindigkeit Ihres Schneider CPCs noch erfreulich kurz. Prinzipiell arbeiten fast alle Schattierungsroutinen nach dem gleichen Schema. Zuerst werden die Winkel zwischen allen Flächen und dem Vektor, der die Lichtquelle beschreibt, berechnet und in einem Feld im Speicher abgelegt. Im nächsten Schritt werden die Flächen in der Reihe ihrer Sichtbarkeit geordnet und in dieser Reihenfolge auf den Bildschirm ausgegeben. Diese Reihenfolge führt zu den ersten Problemen. Bei genauer Betrachtung stellen Sie nämlich fest, daß die Entscheidung, ob ein Gegenstand sichtbar ist, für das menschliche Auge automatisch geklärt ist. Den Computer stellt solch eine Entscheidung aber vor eine schwer lösbare Aufgabe. Ein besonders beliebtes und einfaches Sortierkriterium für dieses Problem ist die Länge des Normalenvektors. Dieser liefert aber leider nicht immer zufriedenstellende Ergebnisse. Eine weitere Schwierigkeit dieses Verfahrens liegt darin, daß einzelne Flächen nicht einfach nacheinander auf den Bildschirm gezeichnet werden dürfen. Denken Sie beispielsweise an zwei Flächen, die sich gegenseitig überlappen. Schon darf nicht die erste Fläche und nachfolgend die zweite gezeichnet werden. Der nächste - und für uns auch schon recht brauchbare - Weg verzichtet auf das Sortieren der Flächen. Sie erscheinen einfach in beliebiger Reihenfolge auf dem Bildschirm. Dabei berechnet der Computer von jedem gezeichneten Punkt die Tiefe und legt diesen Wert im Speicher ab. Die Tiefe jedes weiteren Punktes, der an derselben Stelle gesetzt werden soll, wird mit dem schon vorhandenen Wert verglichen und nur gezeichnet, wenn er weiter vorne liegt. Speichevprobleme Doch auch damit ist das Problem noch nicht gelöst. Selbst wenn man für die Tiefe jedes Bildpunktes nur ein Byte reserviert, reicht der Speicherplatz des Computers nicht aus. Bei einer Auflösung von 128000 Bildpunkten (640 mal 200) benötigt in so einem Fall allein das Bild 128 KByte. Auch diese Idee ist damit auf einem Schneider CPC nicht zu realisieren. Dennoch hilft dieser Ansatz weiter. Wenn der Computer das Bild zeilenweise aufbaut, dann ist pro Grafikspalte nur noch ein Tiefenwert nötig. Das Flußdiagramm in den Bildern 1 bis 6 erklärt die Schattierungsroutine von CPC-Giga-CAD. Der Hauptteil der Routine ist vollständig in Maschinensprache geschrieben. Als erstes müssen ein paar Vorbereitungen getroffen werden. Wie bereits oben erwähnt, muß der Winkel zwischen dem Normalenvektor der Fläche und dem Lichtquellenvektor berechnet werden. Hierbei ist natürlich prinzipiell der Unterschied zum Ortsvektor zu bedenken; in der Mathematik aber nur eine Sache der Definition. Wie berechnet man nun den Winkel zwischen den beiden Vektoren? Folgende Formel ergibt sich aus der Definition des Skalarprodukts:
Das Skalarprodukt ist im dreidimen sionalen Raum folgendermaßen defi niert:
In unserem Fall interessiert nicht der Winkel zwischen zwei Vektoren, sondern der zwischen Ebene und Vektor. Aus diesem Grund nimmt man den Normalenvektor zu Hilfe, der auf der Ebene senkrecht steht und somit mit dieser einen Winkel von 90 Grad bildet. Der Winkel zwischen Normalen- und Lichtquellenvektor ist also 90 Grad minus den gesuchten Winkel. Um nun den Normalenvektor zu berechnen, brauchen Sie zwei linear unabhängige Vektoren, die die Ebene aufspannen. Drei Eckpunkte der gegebenen Fläche legen diese beiden Vektoren schon eindeutig fest.
Verschieben Sie nun die Ebene in den Ursprung (durch Subtraktion des Vektors A), so erhalten Sie eine parallele Ebene, die durch die Vektoren u und v aufgespannt wird. Der Normalenvektor läßt sich nun als Vektorprodukt von u und v berechnen.
Die jeweilige Koordinate berechnet sich aus der Determinante der Restkoordinaten. Der zweiten Determinante muß ein Minuszeichen vorangestellt werden. Den so berechneten Vektor brau chen Sie nur noch in die bereits herge leitete Formel einzusetzen:
Schließlich bleibt noch zu klären, wie man den Betrag eines Vektors ermittelt. Dazu nehmen Sie folgende Formel:
Die Schattierungsroutine multipiziert den Cosinus dieses Winkels mit 64. Dadurch liegt der berechnete Wert immer zwischen 0 und 64. Der Wert wird als 1 -Byte-Zahl im Speicher abgelegt und der ganze Prozeß mit jeder einzelnen Fläche wiederholt. Um die Wartezeiten so kurz wie möglich zu halten, bestimmt das Programm anschließend die absoluten Extrema des Objektes und die relativen Extrema jeder Fläche. Damit arbeitet der Computer immer nur im für die Ausgabe Beschränkung auf das Wesentliche interessanten Bereich. Alle diese Werte werden in einem Feld abgelegt. Die 3D-Koordinaten der Eckpunkte müssen nun in Bildschirmkoordinaten umgerechnet und codiert im Speicher gesichert werden. Nun kann endlich die Schattierung beginnen. Die Variablen für das Programm finden Sie in Tabelle 1. Alles weitere erklärt sich aus dem Flußdiagramm. Als letztes nehmen wir die einzelnen Komponenten der eigentlichen Schattierungsroutine unter die Lupe. Da sich das Bild zeilenweise aufbaut, startet die Routine mit einer Schleife (Bild 1) beim Minimum ED. Alle folgenden Grafikspalten, in denen gezeichnet wird, erfahren die gleiche Behandlung. Jeder gesetzte Punkt wird auf seine räumliche Tiefe hin überprüft. Daher muß zuerst das Feld mit den Werten für jede einzelne Grafikspalte auf den Wert der hinteren Schnittebene x gesetzt werden. Dadurch ist gewährleistet, daß der erste Punkt in einer bestimmten Grafikspalte nicht übergangen wird. Die Tiefe ist an der entsprechenden Stelle garantiert gespeichert. In einer weiteren Schleife werden alle Flächen des Gebildes für jede Grafikspalte neu bearbeitet. Das mutet sehr umständlich an, ist aber die weitaus schnellste Methode. Ein Vergleich der Grafikzeile LA mit den im Feld gespeicherten Extrema prüft, ob die Zeile innerhalb dieser Grenzen liegt. Schneidet die Grafikzeile die Fläche nicht, so wird diese übergangen und die nächste Fläche behandelt. Diese Methode reduziert die Wartezeiten auf ein Minimum. Die folgende Schleife ermittelt von allen Randlinien der aktuellen Fläche die Anfangs- und die Endkoordinaten. Diese Koordinaten werden am Punkt 1 einem Unterprogramm (Bild 2) übergeben. Dieses hat allein die Aufgabe, die Schnittpunkte der Fläche mit der Zeile LA zu bestimmen. Ein weiteres Unterprogramm (Bild 3) berücksichtigt die Fälle, bei denen der Schnittpunkt außerhalb des Bildschirms liegt. Ob diese Schnittpunkte eingezeichnet werden müssen, entscheidet die Verbindungsvorschrift. Um zu testen, ob der gezeichnete Punkt sichtbar ist oder nicht, wird mit Hilfe des Strahlensatzes die Tiefe der Schnittpunkte über die Eckpunkte der Linie berechnet und gegebenenfalls gezeichnet. Dazu wird ein weiteres Unterprogramm aufgerufen. Da einige Eckpunkte zu doppelten Schnittpunkten führen, werden die überflüssigen Werte zuerst herausgefiltert. Ist der Test mit allen Randlinien durchgeführt und die Anzahl der Schnittpunkte ausreichend, so ruft das Programm über die Verbindungsstelle 11 eine weitere Routine (Bild 4) auf. Diese Routine sortiert als erstes die Schnittpunkte der Größe nach. Als zweites werden die erste und zweite, die dritte und vierte Linie im Schattierungsraster miteinander verbunden. Deshalb muß wiederum eine Schleife (Bild 5) die Tiefen sämtlicher Punkte dieser Linie berechnen. Liegt ein Punkt vor einem bereits gezeichneten Punkt, so wird in die Routine verzweigt, die endlich diesen Punkt setzt. Gegebenenfalls muß der zuvor berechnete Winkel der Fläche aus dem Feld geholt und damit das Schattierungsraster berechnet werden. Die gleiche Routine dient auch dazu, die Randlinien einer Fläche einzuzeichnen. Die ganze Prozedur wiederholt sich dabei pro Zeile mit jeder Fläche. Mit dieser Routine erhalten Sie eine Grafik, deren unsichtbare Linien und Flächen realitätsnah ausgeblendet sind. Und dabei ist das Programm noch außerordentlich schnell. Eine Schattierung in einfacher Auflösung braucht immerhin weniger als eine Minute Rechenzeit.
(Marcus Hutter/Stefan Groll/hg), HC
|
| ![]() |