-
Die Erfindung betrifft ein Verfahren zur dreidimensionalen
Visualisierung von in Baumform digital kodierten Objekten
und eine Vorrichtung zur Durchführung dieses Verfahrens.
-
Die digitale Kodierung von Bildern in Baumform, einer Form,
die im allgemeinen "Octree" genannt wird, ist durch
zahlreiche Veröffentlichungen bekannt, beispielsweise durch den
Artikel von D.J.R. MEAGHER: "High Speed Display of 3D
Medical Images using Octree Encoding", erschienen in
"Rensselaer Polytechnic Institute Technical Report" vom
September 1981, oder durch den Artikel "Geometric Modeling
Using Octree Encoding" vom selben Autor, erschienen in der
Zeitschrift Computer Graphics and Image Processing No.19 vom
Juni 1982, Seiten 129 bis 147.
-
Ferner ist aus dem US-Patent Nr. 4 694 404 oder der
europäischen Patentanmeldung Nr. 0 152 741 ein Verfahren zur
dreidimensionalen Visualisierung (3D) ausgehend von Bildern
eines in Octree-Form kodierten Objekts bekannt. Dieses
Verfahren besteht im wesentlichen darin, daß ausgehend von den
in einem Objektuniversum organisierten Octree-Informationen
die Projektion dieses Objekts in einer Zielebene parallel
zum Beobachtungsschirm geformt wird.
-
Dieses bekannte Verfahren liefert 3D-Bilder guter Qualität,
erfordert jedoch für seine Durchführung umfangreiche und
kostspielige Geräte.
-
Gegenstand der Erfindung ist ein Verfahren zur
dreidimensionalen
Visualisierung von in Octree-Form kodierten Objekten,
das sehr schnell ist, und zwar sowohl bei Außenansichten
gegebenenfalls mit Schattierungen als auch bei Ansichten in
einem beliebigen Schnitt, und das zu seiner Durchführung
eine nicht sehr komplexe und sehr kostspielige Vorrichtung
erfordert.
-
Gegenstand der Erfindung ist deshalb ein Verfahren zur
dreidimensionalen Visualisierung von in Octree-Form digital
kodierten Objekten, wobei der Octree in einem Octree-
Speicher in einer Baumstruktur gespeichert ist, die in jeder
Ebene durch Zweiteilung der Dimensionen des Objektuniversums
oder dessen Unterobjektuniversen in jeder Koordinatenachse
Ox, Oy und Oz erhalten wird, wobei das Objektuniversum ein
Würfel ist, der die gesamte darzustellende Information
enthält, dadurch gekennzeichnet, daß man ausgehend vom
Objektuniversum nur den Nutzteil eines anderen Ziel-Octree in
einem Zieluniversum erzeugt, wobei das Zieluniversum ein
Hexaeder ist, dessen Koordinatenachsen Ox', Oy' eine Ebene
bilden, die zu einem Darstellungsbildschirm parallel ist.
-
Der Nutzteil dieses anderen Octree kann hierbei dazu dienen,
entweder den sichtbaren Teil eines Objekts darzustellen
(Weglassung der versteckten Teile) oder alles wegzulassen, was
auf der "falschen" Seite einer Schnittebene liegt, oder nur
die auf der Schnittebene liegenden Obel zu wählen oder alles
zu wählen (transparenter Modus).
-
Zum besseren Verständnis der Erfindung wird im folgenden ein
Ausführungsbeispiel beschrieben, das in der beiliegenden
Zeichnung dargestellt ist. In dieser Zeichnung zeigen:
-
Fig. 1 eine schematische perspektivische Darstellung eines
Objektuniversums,
-
Fig. 2 ein vereinfachtes Diagramm zur Erläuterung der
Octree-Struktur,
-
Fig. 3 ein Diagramm, das teilweise die Organisierung der
Daten im Octree-Speicher im Fall eines kurzen Offset
und in Fig. 3A im Fall eines langen Offset zeigt,
-
Fig. 4 ein zweidimensionales Diagramm zur Erläuterung der
Abtastung eines "Overlay",
-
Fig. 5 und 6 Diagramme zur Erläuterung der Bildung und
Numerierung der "Sohn-Overlays",
-
Fig. 7 ein Diagramm zur Erläuterung der Bildung des
Zieluniversums gemäß der Erfindung,
-
Fig. 8 und 9 ein Diagramm zur Erläuterung des Tests zur
Bestimmung der Werte der gesehenen Bildelemente des
Ziels bzw. ein Diagramm zur Erläuterung der Wahl des
neuen Overlays gemäß der Erfindung,
-
Fig. 10 ein Diagramm zur Erläuterung der Bestimmung der
Schnitte gemäß der Erfindung,
-
Fig. 11 ein vereinfachtes Blockdiagramm einer Vorrichtung
zur Durchführung des erfindungsgemäßen Verfahrens,
-
Fig. 12 und 15 bis 29 schematische Darstellungen von Teilen
der Vorrichtung von Fig. 11, und
-
Fig. 13, 14 und 30 Diagramme zur Erläuterung der
Arbeitsweise mancher Schaltungen der Vorrichtung von
Fig. 11.
-
Vor der ausführlichen Beschreibung der Erfindung sei kurz
unter Bezugnahme auf Fig. 1 bis 6 beschrieben, wie im
Speicher die dreidimensionalen Objekten entsprechenden Daten,
die beispielsweise von nacheinander von einem "Scanner"
hergestellten parallelen Schnitten stammen, angeordnet und wie
diese Daten verwendet werden können.
-
Fig. 1 zeigt einen Würfel 1, der "Objektuniversum" genannt
wird und die gesamte darzustellende Information enthält,
d.h. das (in 3D) darzustellende Objekt 2 ist ganz in diesem
enthalten. Dieser Würfel 1 ist so ausgerichtet, daß jede
seiner Kanten zu einer der drei Achsen eines rechteckigen
Koordinatensystems Ox, Oy, Oz parallel ist, wobei eines der
Ecken des Würfels im Nullpunkt des Koordinatensystems liegt.
Aus weiter unten erläuterten Gründen sind die Abmessungen
des Würfels 1 in Hexadezimaldarstellung gleich 7FFF, sind
jedoch nicht gleich den tatsächlichen Abmessungen des
darzustellenden Objekts.
-
Zur Abtastung des im Würfel 1 enthaltenen Objekts wird eine
"hierarchische Dichotomie" vorgenommen. Zu diesem Zweck wird
der Würfel 1 in acht gleich große Würfel C0 bis C7 geteilt,
indem man den Würfel 1 parallel zu jeder der drei den
Trieder (Ox, Oy, Oz) bildenden Ebenen halbiert. Jeder Würfel
C0 bis C7 hat Kanten, deren Länge 3FFF in Hexadezimal-
Schreibweise ist.
-
Jeder der Würfel C0 bis C7 wird auf gleiche Weise wieder in
acht Teile geteilt und so fort.
-
Man erhält auf diese Weise eine "Hierarchie" mit mehreren
Ebenen, an deren Spitze (definiert als Ebene Null) der
Würfel 1 liegt. In der Ebene 1 liegen die Würfel C0 bis C7 und
so fort. Im Nachstehenden wird erläutert, auf welcher Ebene
diese Hierarchie anhält, um die gewünschte Lösung zu
erreichen.
-
Der Würfel 1 wird "Vater" der Würfel C0 bis C7 genannt, die
ihrerseits "Obel" (Abkürzung von "Objekt-Element") genannt
werden. Jeder Würfel C0 bis C7 ist der Vater von acht
Würfeln der folgenden Ebene (Ebene 2) usw..
-
In jeder Ebene werden die acht Würfel oder von einem
gemeinsamen Vater stammenden Sohn-Obel nach einer festen Regel
numeriert.
-
So haben die Mittelpunkte der Sohn-Obel, wie in Fig. 2
dargestellt ist, in der Ebene 1 die folgenden Koordinaten (nach
Ox, Oy, Oz) in Hexadezimal-Schreibweise:
-
C0 : 1FFF, 1FFF, 1FFF
-
C1 : 5FFF, 1FFF, 1FFF
-
C2 : 1FFF, 5FFF, 1FFF
-
C3 : 5FFF, 5FFF, 1FFF
-
C4 : 1FFF, 1FFF, 5FFF
-
C5 : 5FFF, 1FFF, 5FFF
-
C6 : 1FFF, 5FFFt 5FFF
-
C7 : 5FFF, 5FFF, 5FFF
-
Nun sei untersucht, wie die Koordinaten von in den Würfeln
enthaltenen Punkten in Hexadezimaldarstellung und dann in
Binärdarstellung geschrieben werden. Zur Vereinfachung
werden die Koordinaten der Mittelpunkte der Würfel C0 und C1
in Ox genommen. Von hier aus läßt sich dann auf die anderen
Koordinatenachsen und auf jede beliebige Ebene
verallgemeinern.
-
Die Koordinate x&sub0; des Mittelpunkts von C0 ist:
-
x&sub0; = 1 F F F (Hexadezimal)
-
oder
-
x&sub0; = 001 1111 1111 1111 (binär)
-
Die Koordinate x1 des Mittelpunkts von C1 ist:
-
x1 = 5 F F F (Hexadezimal)
-
oder
-
x1 = 101 1111 1111 1111 (binär).
-
In der Binärdarstellung haben die verwendeten Bits von
rechts nach links die Stellenwerte 0 bis 14. Es genügt also,
die Bits mit dem Stellenwert 14 zu betrachten, um zu
bestimmen, ob die betreffenden Punkte im linken Würfel (C0) :
Bit = 0 oder im rechten (C1) liegen: Bit = 1. Dasselbe gilt
für jeden beliebigen in diesen Würfeln liegenden Punkt : die
Koordinate eines beliebigen in C0 liegenden Punkt nach Ox
ist kleiner als 3FFF, d.h. sein Bit vom Stellenwert 14 in
Binärdarstellung ist immer Null, während die Koordinate
eines beliebigen in C1 liegenden Punktes nach Ox zwischen
3FFF und 7FFF beträgt, d.h. sein Bit vom Gewicht 14 in
Binärdarstellung ist immer gleich 1.
-
Diese Zerlegung des Objektuniversums 1 (Ausgangsuniversum)
bildet einen Baum, den man "Octree" nennt (Zusammenziehung
von "Octant-tree") Jeder "Knoten" dieses Baums entspricht
einem Würfel. Ein Knoten des Octree-Baums trägt zwei
Informationstypen: einen Wert des Zustands des Knotens und
verschiedene Eigenschaften.
-
Der Zustand eines Knotens kann drei Werte haben: E, P oder
F:
-
E (für "empty") stellt einen leeren Knoten dar, und
bedeutet, daß das Volumen des entsprechenden Würfels keine mit
ihm verknüpfte Eigenschaft enthält. Der entsprechende Würfel
wird nicht weiter zerlegt und hat somit keine Söhne. Dies
ist der Fall, wenn ein Würfel ganz außerhalb des
darzustellenden Objekts liegt (er enthält nur Umgebungsluft).
-
P (für "partial") stellt einen Knoten dar, von dem ein Teil
der Nachkommen Eigenschaften besitzt. Dies ist der Fall bei
einem Würfel, von dem ein Teil in dem darzustellenden Objekt
und ein Teil außerhalb dieses Objekts liegt.
-
F (für "full") stellt einen Knoten dar, der eine
einheitliche Eigenschaft besitzt, der aber keine Nachkommen hat und
folglich im Octree-Baum ein "Blatt" ist.
-
Die Eigenschaften eines Knotens stellen die
charakteristische Information des entsprechenden Obel dar. Im Fall eines
Blatt-Obel kann diese Information beispielsweise eine am
Scanner gemessene Stoffdichte sein. Im Fall eines teilweise
gefüllten Obel (Knoten P) kann diese Information eine
Kondensation der Information der Sohn-Obel sein (Mittelwert der
Dichten der Söhne oder Minimum und Maximum der Dichten der
Söhne).
-
Wenn die einzige Eigenschaft das Vorhandensein oder
Nichtvorhandensein des Objekts im betreffenden Obel ist, reicht die
Kodierung des Werts des Obel mit F, P oder E aus und ist
keine Eigenschaftskodierung erforderlich. Man sagt dann, daß
das beschriebene Objekt binär ist.
-
Fig. 2 zeigt ein vereinfachtes Beispiel eines Octree-Baums.
Man geht davon aus, daß das darzustellende Objekt 3 nur in
den Würfeln C0 und C1 enthalten ist und daß es ein Quader
ist, dessen Kanten zu den Achsen Ox, Oy bzw. Oz parallel
sind. Das Objekt 3 erstreckt sich längs Ox von 1FFF bis
7FFF, längs Oy von 0 bis 1FFF und längs Oz von 0 bis 1FFF.
Man nimmt an, daß dieses Objekt binär ist.
-
Auf der Ebene 0 ist der dem Würfel 1 entsprechende Knoten
"P". Auf der Ebene 1 sind von den acht Söhnen des Würfels 1
nur die beiden ersten "P", die anderen sind "E". (C0 bis C7
wird in jeder Ebene von rechts nach links durchnumeriert).
Also nur die Würfel C0 und C1 haben Söhne in der Ebene 2.
Die Söhne der Würfel C0 und C1 sind die Würfel C00 bis C07
bzw. C10 bis C17. Von den Söhnen von C0 ist C01 "F" und alle
anderen sind "E", und von den Söhnen von C1 sind C10 und C11
"F" und alle anderen sind "E", wie die getrennten
schematischen Darstellungen von C0 und C1 in Fig. 2 zeigen. Nach der
Ebene 2 braucht man in der Hirarchie nicht weiterzugehen, da
diese keine Knoten "P" mehr besitzt.
-
Nachdem nun erläutert wurde, wie ein Octree gebildet wird,
wird beschrieben, wie die Daten kodiert werden und wie sie
im Speicher (Octree-Speicher) angeordnet werden, um so
leicht wie möglich ausgewertet werden zu können.
-
Die drei Werte, die der Zustand eines Knotens annehmen kann,
sind auf zwei Bit kodiert. Man kodiert beispielsweise 00 für
E, 01 für P, 10 für F. Der verbleibende Wert 11 = F1 kann
zur Darstellung eines zweiten Objekts in derselben
Datenstruktur verwendet werden.
-
Als Knotenpaket ist eine Gruppe von acht Knoten definiert,
die denselben Vater haben. Ein Paket wird also auf 16 Bit
kodiert, die durch die Verkettung der Werte der acht Knoten
gebildet werden, und zwar in der Reihenfolge ihrer
Obel-Nummern, wobei die Nummer 0 (Null) sich auf der Seite der
unteren Stellen befindet.
-
Als Knotenpaketblock ist eine Gruppe von Knotenpaketen
definiert, die die Söhne der Knoten eines gemeinsamen
Knotenpakets, Vaterpaket des Blocks genannt, sind. Ein Block kann
also je nach der Anzahl partieller Knoten ("P") des Vater-
Knotenpakets 1 bis 8 Knotenpakete (d.h. 3 bis 64 Knoten)
enthalten.
-
Ein Knotenpaketblock ist in einem Speicher mit
aufeinanderfolgenden Adressen von 32 Bitwörtern gespeichert. Jedes
32-Bit-Wort enthält in 16 Bit, beispielsweise den 16 Bit mit
den niedrigen Stellenwerten, die 8 Werte der Knoten des
entsprechenden Knotenpakets und in den anderen 16 Bit (im
vorliegenden Fall den Bit mit den hohen Stellenwerten) den
Adressen-Offset.
-
Dieser Adressen-Offset ist der Wert, der der gespeicherten
absoluten Adresse eines Vater-Knotenpakets hinzuzufügen ist,
um die gespeicherte absolute Adresse jedes der Pakete seines
Sohn-Paketblocks zu finden. Fig. 3 zeigt schematisch einen
Sohn-Block 4 und seinen Vater 5. Mit 6 ist schematisch ein
Addierer dargestellt, der die Addierung des Offset vornimmt,
der mit 7 bezeichnet ist.
-
Wenn der Offset größer oder gleich FFFFh (d.h. 16 Bit alle
gleich "1") oder negativ ist, schreibt man in das Feld 7'
von 16 Bit mit hohen Stellenwerten die Hinweisadresse FFFFh,
und der eigentliche Offset 7" wird in der folgenden Adresse
in einem mit Vorzeichen versehenen Format gespeichert, wie
Fig. 3A zeigt.
-
Die verschiedenen Eigenschaften der Knoten ein und desselben
Blocks 4 werden gegebenenfalls in einem Feld in der
unmittelbaren Folge dieses Blocks (Bezugszahl 8 in Fig. 3) in der
Reihenfolge gespeichert, in der sich die Knoten im Block
befinden, und zwar bei den Knoten, die eine Eigenschaft
besitzen. Die Länge des Feldes 8 hängt von der Länge der
Kodierung der Eigenschaften ab.
-
Die verschiedenen Informationen von Eigenschaften von Knoten
können beispielsweise die Dichte (Scanner-Dichte) sein, die
auf 8 oder 12 Bit kodiert ist, wobei n Identifikationsbit
(beispielsweise n = 4) die Registrierung von 2n
verschiedenen Objekten im selben Knoten gestattet (in dem Fall, in dem
der genannte Wert der Knotenzustandskodierung F1 = 11 nicht
genügt, d.h., wenn mehr als zwei Objekte vorhanden sind),
und eine auf bekannte Weise vorberechnete Schattierung auf
beispielsweise 8 oder 12 Bit.
-
Der Octree wird in einen Speicher, Octree-Speicher genannt,
eingeschrieben, der bei dem bevorzugten Ausführungsbeispiel
mit 32 Bitwörtern adressiert ist. Die Adresse des Octree ist
die Adresse des Knotenpakets der Ebene 0 des Octree. Dieses
Knotenpaket, Vater-Knotenpaket genannt, ist ein auf ein
einziges Knotenpaket reduzierter Block. Die gegebenenfalls
vorhandenen Eigenschaften jedes der acht Knoten dieses Pakets
werden nach diesem Paket gespeichert. (In der Praxis kann
der Knoten "P" der Spitze der Hierarchie in der
theoretischen Octree-Struktur von Fig. 2 in einem gespeicherten
Octree weggelassen werden, da dieser Knoten so gut wie immer
"P" ist. Es genügt hierbei also, die Ebenen der gesamten
theoretischen Hierarchie um eine Stufe nach unten zu
versetzen, wobei die Ebene 0 die der acht ersten Sohn-Knoten
des einzigen weggelassenen Vaters ist).
-
Um die gespeicherte Struktur zur Visualisierung des in dem
Objektuniversum enthaltenen Objekts auf einem Bildschirm
verwenden zu können, der bezüglich dieses Objekts in einer
beliebigen Richtung angeordnet ist, muß man zunächst für jeden
Punkt des Objekts nicht nur sein eigenes Obel, sondern auch
die sieben diesem Obel benachbarten Obel bestimmen, die
diesem Punkt am nächsten sind und in derselben Ebene des Octree
liegen. Diese Gruppe von acht einen Würfel bildenden Obel
wird "Overlay" genannt. Diese acht Obel, die jeweils über
drei Flächen an drei andere Obel anschließen, müssen nicht
notwendigerweise denselben Vater im Octree haben. Es sind
also acht Knotenpakete (also 64 Knoten) erforderlich, um die
Eigenschaften eines Overlay zu kennzeichnen. Wie aus dem
Nachstehenden hervorgeht, dienen die Overlays dazu, einen
anderen Octree zu erstellen, der einem beliebigen
Blickwinkel des Objekts entspricht, da in diesem Fall das Obel, das
für einen Punkt dieses Objekts in einem auf diesen
Blickwinkel bezogenen Koordinatenachsensystem (Ebene der Achsen Ox
und senkrecht zur Betrachtungsachse) bestimmt ist, die den
Ursprungs-Obel des Punktes benachbarten Obel überdeckt, die
nicht außer Acht gelassen werden dürfen, wenn man nicht
Informationen verlieren möchte.
-
Das Bezugssystem eines Overlays ist durch drei Achsen Ox',
Oy', Oz' definiert, die zu denen des Objektuniversums 1
parallel sind, wobei der Nullpunkt 0 des Overlay eines der
Ecken des Obel Nummer Null des Overlay ist. Die fiktiven
Abmessungen des Overlay sind in jeder Ebene in
Hexadezimal-Schreibweise (7FFF, 7FFF, 7FFF). Die Obel des
Overlay sind nach derselben Regel wie bei dem Octree
numeriert.
-
In jeder Ebene des Octree-Baums grenzt ein Overlay einen
Raum des Objektuniversums ab, der alle für die Behandlung
dieser Ebene erforderlichen Informationen enthält. In jeder
Ebene ist der Overlay durch die Koordinaten x', y', z'
festgelegt, die zwischen 0 und 7FFF (in Hexadezimal-Darstellung)
liegen.
-
Das Diagramm von Fig. 4 zeigt (in zwei Dimensionen, was auf
drei Dimensionen zu übertragen ist), wie die Overlays
bestimmt werden. 9 sei ein Punkt des darzustellenden
Objekts. Dieser Punkt befindet sich in dem schraffierten
Obel, d.h. in dem Obel C12 (2tes Sohn-Obel des Obel C1 oder
2ter Knoten des Sohn-Pakets des Obels 1). Da die Abzisse x'
des Punkts 9 zwischen 3FFF (Abszisse des Mittelpunkts des
Würfels 1) und 5FFF (Abszisse des Mittelpunkts des Obels C1)
liegt, hat sein Wert in Hexadezimal-Darstellung die Form:
x'= 4ghk (ghk sind Hexadezimalzahlen zwischen 0 und F).
Desgleichen hat die Ordinate y' des Punkts 9 die Form
y'= 3uvw. So muß man für einen Punkt, der in einem Overlay
durch seine Koordinaten x', y', z' gegeben ist, in dem
gespeicherten Octree die mit diesem Punkt verbundene
Information finden. Hierzu muß man mit jeder Gruppe von Koordinaten
(x', y', z') die Adressen (Obel, Knoten) im Overlay in
Korrespondenz bringen, die das Auffinden der Adresse im
gespeicherten Octree gestatten.
-
Da der Overlay aus 64 Knoten besteht, ergeben die beiden Bit
mit dem Stellenwert 14 und l3 der Koordinaten (x', y', z')
eines beliebigen Punktes im Overlay die Obel-Nummer bzw. die
Knoten-Nummer in diesem Obel, das den betreffenden Punkt
enthält: (Gleichung Nr. 1)
-
Obel-Nummer = def (was eine binäre Zahl ist, bei der d = Bit
14 von z', e = Bit 14 von y' und f = Bit 14 von x')
und
-
Knoten-Nummer = ghi (was ebenfalls eine binäre Zahl ist, in
der g = Bit 13 von z', h = Bit 13 von y' und i = Bit 13 von
x' ist).
-
Unter den 64 Knoten eines Overlay gibt es 27 Arten (3 Arten
in jeder Koordinatenachse: 2 benachbarte Knoten von 4),
8 Knoten zu wählen, um die 8 Obel eines neuen Overlay,
Sohn-Overlay genannt, zu formen. Ein Overlay hat also 27
Söhne.
-
Die Fig. 5 und 6 zeigen schematisch, wie die Overlays
ausgewählt werden (Fig. 5 ist eine Darstellung in der Ebene Ox',
Oy' und ist leicht auf drei Dimensionen übertragbar).
-
Für jede Koordinatenachse gibt es drei mögliche Fälle, die
von 0 bis 2 numeriert sind:
-
- Fall 0 : Der Sohn-Overlay liegt in dem Intervall 0-3FFF
-
- Fall 1 : Der Sohn-Overlay liegt in dem Intervall 2000-5FFF
-
- Fall 2 : Der Sohn-Overlay liegt im Intervall 4000-7FFF.
-
Die in dem Kreis 10 von Fig. 5 dargestellten Sohn-Overlays
beziehen sich auf den Fall 1 in der Achse Oy' und auf den
Fall 2 in der Achse Ox'.
-
Die 27 möglichen Fälle werden durch das Triplet der Fälle
bezüglich jeder der Dimensionen bezeichnet: (Fälle in Oz';
Fälle in Oy', Fälle in Ox').
-
Der Sohn-Overlay hat wieder die Abmessung 0 bis 7FFF (der
Wert 7FFF des Sohn-Overlay ist wohlgemerkt nicht derselbe
wie der des Vaters, sondern macht seine Hälfte aus.
-
Wenn X' die Koordinate eines Punktes im Sohn-Overlay auf Ox'
und x' seine Koordinate im Vater ist, erhält man die
Beziehung: (Gleichung Nr. 2)
-
X' = 2.(x' - d)
-
wobei der Wert von d (in Hexadezimaldarstellung) folgender
ist (vgl. Fig. 6):
-
0 im Fall 0
-
2000 im Fall 1
-
4000 im Fall 2.
-
Da das Ziel der Erfindung die Darstellung des Bildes eines
Objekts auf einem Bildschirm ist, wird nun ein
"Zieluniversum" definiert. Die folgende Beschreibung bezieht sich
auf den Fall, in dem eine Gerade aus Projektion vorgenommen
wird. Die Erfindung ist jedoch nicht auf eine solche
Projektion beschränkt, sondern man kann auch beispielsweise eine
perspektivische Projektion vornehmen, indem das
Zieluniversum entsprechend verformt wird. Im Gegensatz zu dem in dem
genannten europäischen Patent beschriebenen Verfahren, gemäß
welchem man in die Ebene des Bildschirms die einzelnen Obel
projiziert, besteht das erfindungsgemäße Verfahren im
wesentlichen darin, daß ausgehend von dem gespeicherten Octree ein
anderer Octree gebildet wird, dessen Achsen Ox" und Oy" eine
zum Bildschirm parallele Ebene bilden, wobei die Achse Oz"
des neuen Octree auf den Bildschirm zu gerichtet ist, und
daß nur der vom Bildschirm aus sichtbare Teil dieses neuen
Octree generiert wird.
-
Das Zieluniversum (in Analogie zum "Objektuniversum") ist
das, das dem neuen Octree entspricht. Dieses Universum ist
ganz im Overlay des Objekts enthalten. Die Stellung des
Zieluniversums ist in dem Koordinatensystem des Overlay des
Objekts durch seinen Mittelpunkt festgelegt, den man hier
"Target Center" nennt, und durch die im Overlay von diesem
Mittelpunkt zu einem besonderen Punkt des Ziels
vorzunehmende Verschiebung. Diese Verschiebung wird hier "child offset"
oder "Bbox offset" bei manchen spezifischen Punkten des
Ziels genannt, die im nachstehenden noch beschrieben werden.
In Fig. 7 ist sehr schematisch ein beliebiger Overlay 11
sowie ein Ziel des Zieluniversums 12 mit dem Mittelpunkt 13
dargestellt (es handelt sich hier keineswegs um eine
klassische Projektion von Volumen auf eine Ebene, sondern eher um
ein erläuterndes Diagramm).
-
Das Zieluniversum 12 ist so ausgelegt, daß, wie oben erwähnt
wurde, die von seinen Achsen Ox", Oy" gebildete Ebene zur
Ebene eines Bildschirms 14 parallel ist. Das Zieluniversum
stellt das Obel der Ebene 0 des zu generierenden Octrees
dar. Jedes Obel besitzt acht durch Dichotomie definierte
Söhne, d.h. durch Zweiteilung des Obels in jeder
Koordinatenachse. Die aufeinanderfolgende Teilung aller Obel definiert
den Baum des Zieloctree.
-
Man definiert das "Bilduniversum" als kanonische Projektion
des Zieluniversums auf den Bildschirm 14. Die Stellung des
Zieluniversums im Overlay 11 des Objekts ist somit durch den
Winkel determiniert, unter dem man das Objekt betrachten
möchte.
-
Der Zieloctree wird kanonisch in einen Bild-"Quadtree"
projiziert ("quad", weil vier Möglichkeiten, da es sich um
eine Projektion auf eine Ebene handelt). Die Entsprechung
zwischen den Obel-Nummern des Zieloctrees und den
"Imel"-Nummern (Zusammenziehung von "image elements", da es sich um
eine Ebene handelt) des Bild-Quadtrees ist konstant und
unabhängig vom Blickwinkel sowie von der Ebene des Octrees.
-
Die Obel des Octrees werden auf die Imel des Quadtrees des
Bildes auf folgende Weise gemäß dem Obel projiziert, das dem
Bildschirm am nächsten ist, wenn es das andere maskiert,
oder dem anderen, wenn es nicht vom ersten maskiert wird
(d.h. wenn das erste leer ist):
-
Obel 0 oder 4 auf das Imel 0, Obel 1 oder 5 auf das Imel 1,
Obel 2 oder 6 auf das Imel 2, und Obel 3 oder 7 auf das Imel
3. Vereinbarungsgemäß verdecken die Obel 4, 5, 6 und 7, die
dem Bildschirm am nächsten liegen, die Obel 0, 1, 2 bzw. 3.
Man kann deshalb folgende Regel aufstellen: das Obel Nummer
Cn, das auf drei Bit "b2 : b1 : b0" geschrieben wird, wird
auf das Imel Nummer "b1 b0" projiziert, wobei b2, b1 und b0
die Koordinaten nach Oz", Oy" und Ox" sind.
-
Die Matrix der Pixel des auf dem Bildschirm erhaltenen
Bildes
entspricht der Gesamtheit der Imel ein und derselben
Ebene des Quadtrees. Die Pixel eines 512 x 512-Pixel-Bildes
werden hierbei in der Ebene 8 des Quadtrees erreicht, wobei
die erste Ebene die Ebene Null ist, die vier Imel in einem
Knotenpaket-Quadtree darstellt.
-
Die Abtastfunktion des Overlay gestattet die Bestimmung des
Wertes des Knotens eines Obel des Zieloctrees je nach seiner
Stellung im Objekt-Overlay. Hierbei gibt es zwei Fälle je
nachdem, ob das betreffende Obel ein Blatt-Obel des
Zieloctrees ist oder nicht.
-
Zunächst sei bemerkt, daß die Blätter des Zieloctrees immer
in einer feststehenden Ebene generiert werden, die mit der
Größe des Bildes verbunden ist. Ein Obel ist also ein Blatt-
Obel, wenn und nur wenn es sich in der letzten Ebene
befindet.
-
Wenn das Obel ein Blatt-Obel ist, ist der Wert des Ziel-
Obels "E", wenn der Abtastwert des Overlay im Mittelpunkt
des Obel "E" ist, und ist im entgegengesetzten Fall "F".
-
Wenn das Obel kein Blatt-Obel ist, wird ein Test
vorgenommen, der im nachstehenden "Bbox"-Test genannt wird
(Zusammenziehung aus "Bounding Box"), der schematisch in Fig.8
dargestellt ist. Hierin ist 15 ein Ziel-Obel, das zu einem Ziel
16 in einem Overlay 17 gehört. Die Bbox 18 ist das Quader,
dessen Seiten zu den jeweiligen Achsen des Overlays 17
parallel sind und das in ein Ziel-Obel eingeschrieben ist (d.h.
die Kanten dieses Quaders laufen durch die Spitzen des
Ziel-Obels 15). Der Wert des Ziel-Obels ist "E", wenn die
Abtastwerte des Overlay an den acht Ecken 19 (in Fig. 8, die keine
gebräuchliche Projektion auf eine Ebene ist, sind nur vier
Ecken 19 dargestellte der Bbox 18 alle gleich "E" sind, und
sind im anderen Fall "P". Dieser Test ist nur korrekt, wenn
die Größe der Bbox in allen ihren Dimensionen nicht die
Größe der Obel des Overlay überschreitet (d.h. 2000h bei den
Sohn-Obel). Auf diese Weise besteht die Gewißheit, daß, wenn
ein Wert "E" bestimmt wird, keiner der Nachfahren des Obel
15 einen anderen Wert als "E" haben kann, wobei man dieselbe
Regel verwendet. Es ist also erforderlich, daß diese
relativen Abmessungen der Bbox stets überprüft werden. Nun wird
die Regel der Einschließung des Ziels definiert: das Ziel
muß im Overlay eingeschlossen sein, alle Abmessungen der
Bbox des Ziels müssen in jeder der Koordinatenachsen des
Ziels kleiner als 4000h sein.
-
Um eine geometrische Beziehung zwischen den Overlays des
Objekts und dem Zieloctree herzustellen, sieht das
erfindungsgemäße Verfahren vor, daß die Bahnen der Overlays im Objekt
und die Bahn im Zieloctree zusammen kontrolliert werden, so
daß die Ebenen bei ihnen zu jedem Zeitpunkt gleich sind, daß
in jeder Ebene das Ziel-Obel vollständig in das
Objekt-Overlay eingeschlossen ist und daß in jeder Ebene die Bbox-Größe
der Sohn-Obel des Obel des Ziels kleiner als 2000h ist.
-
Wenn man diese Regeln des erfindungsgemäßen Verfahrens
einhält, kann die Wahl des Overlays eines Sohn-Obel
ausschließlich ausgehend von der Stellung seines Mittelpunkts im
Overlay vor sich gehen. Gemäß einer anderen Regel des
erfindungsgemäßen Verfahrens wählt man den Overlay, dessen Mittelpunkt
dem Mittelpunkt des Sohn-Obel am nächsten ist (der
letztgenannte wird mit "child Center" bezeichnet) . Wenn die
Koordinate des Child Center in einer Koordinatenachse des Overlays
(und diese Regel wird für jede der drei Koordinatenachsen
angewendet) kleiner als 3000h ist, legt man den Fall Null
fest, wenn diese Koordinate größer oder gleich 3000h ist und
kleiner als 5000h, legt man den Fall 1 fest, und wenn diese
Koordinate größer oder gleich 5000h ist, legt man den Fall 2
fest. Diese Festlegung ergibt sich also aus der Kombinierung
von drei Bit mit hohem Stellenwert des Child Center und
erfordert keinen Vergleicher. Die Koordinaten des Child Center
in dem neuen ausgewählten Overlay werden das neue "Target
Center" (Mittelpunkt des Ziels) in der folgenden tieferen
Ebene. Diese Regel ist mit dem Diagramm von Fig.9
dargestellt, in der die Bits mit Stellenwert 14, 13 und 12 des
Child Center eingetragen sind. Wenn das von den Bits vom
Stellenwert 14, 13, 12 des Child Center gleich "000", "001"
oder "010" ist, hat man den Fall 0, wenn es gleich "011"
oder "100" ist, den Fall 1, und wenn es gleich "101", "110"
oder "111" ist, den Fall 2. Die entsprechende Stellung des
neuen Overlay (in nur einer Dimension) ist in Fig.9
dargestellt.
-
Das erfindungsgemäße Verfahren gestattet ferner die
Darstellung der Objektschnitte in 3D. Anhand von Fig.10 wird die
Geometrie bezüglich der Schnittebenen erläutert. Die Aufgabe
der Schnittebenen ist es, festzustellen, ob ein Sohn des
laufenden Ziel-Obels sich ganz auf einer Seite oder auf der
anderen Seite von einer beliebigen festgelegten Ebene
befindet oder ob er von dieser Ebene geschnitten wird. In Fig.10
ist diese Schnittebene mit 20 bezeichnet und schneidet das
Ziel-Obel 21. Man sieht den "inneren" Bereich 22 (bezüglich
der Ebene 20), der zur Visualisierung herangezogen wird, und
den "äußeren" Bereich, der wegfallen soll. Diese
Feststellung wird in einer gegebenen Ebene in Abhängigkeit vom
Abstand des betreffenden Sohn-Obels von der Ebene 20
vorgenommen. Eine auf 16 Bit verzeichnete Zahl stellt den Abstand D
zwischen dem bezüglich der Schnittebene am weitesten "innen"
liegenden Eck und der Schnittebene dar (d.h. das von der
Ebene 20 im Bereich 22 am weitesten entfernte Eck des Obel).
Diese Zahl wird so genormt, daß der Abstand L zwischen dem
am weitesten innen liegenden Eck 24 des Ziel-Obel und dem am
weitesten außen liegenden Eck (am weitesten entfernt von der
Ebene 20 im Bereich 23) gleich 7FFFh ist, d.h. die nach den
aufgestellten Konventionen größtmögliche positive Zahl. In
einer bestimmten Ebene erhält man den Abstand D' zwischen
jedem der Sohn-Obel und der Ebene 20, indem man einen mit
Vorzeichen versehenen Offset hinzufügt, dessen Wert aufgrund
der Normung von der Ebene unabhängig ist. Man kann also nun
leicht eine Feststellung über den gewählten Sohn-Obel
machen, indem man diesen Abstand D' kennt:
-
- wenn D' kleiner oder gleich 0 (in mit Vorzeichen
versehenen Wert), befindet sich das Sohn-Obel ganz
außerhalb,
-
- wenn D' positiv oder kleiner als 4000h ist, schneidet
die Ebene das Sohn-Obel (Fall des Sohn-Obel 26), und
-
- wenn D' größer als oder gleich 4000h ist, befindet sich
das Sohn-Obel vollständig innerhalb (Fall des Sohn-Obel 27
beispielsweise).
-
Der neue genormte Abstand für den gewählten Sohn ist einfach
das Doppelte des alten. Dieser neue Abstand ist nur zu
berechnen, wenn das betreffende Obel von der Schnittebene
geschnitten wird. Wenn nämlich ein Obel sich ganz auf einer
Seite einer Schnittebene befindet, liegen seine
gegebenenfalls vorhandenen Söhne ebenfalls auf dieser Seite der
Ebene.
-
Zur Visualisierung des Bilds des untersuchten Objekts werden
die einzelnen Pixel gemalt, die dem zu diesem Objekt
gehörenden Material entsprechen. Wenn während des Durchlaufens des
Ziel-Octrees ein Blatt-obel mit einem Wert "F" behaftet ist,
entscheidet man, das entsprechende Pixel zu malen. Die
Koordinaten x und y des zu malenden Pixel entsprechen den
Koordinaten x', y', z' des betreffenden Obel, die während
des Durchlaufens des Octrees generiert werden.
-
Zum Durchlaufen des Ziel-Octrees wird im erfindungsgemäßen
Verfahren eine Sequenz von Kontrolloperationen ausgeführt,
indem in jeder Ebene bestimmt wird, ob man im Octree weiter
hinuntergehen muß ("push" genannte Operation) und wenn ja,
zu welchem Sohn, oder ob man im Octree aufsteigen muß ("pop"
genannte Operation) und ob das Bild zu malen ist.
-
In einem bestimmten Zustand der Verarbeitung kennt man die
Ebene der Objekt- und Ziel-Octrees, den laufenden Overlay,
die geometrische Stellung des Ziels im laufenden Overlay und
den Status der acht Söhne des laufenden Ziels, d.h. ob sie
bereits aufgesucht wurden oder nicht. Das erfindungsgemäße
Verfahren gestattet in einem Zustand die Durchführung einer
Abtastung dses Overlays an jedem Punkt, insbesondere
entweder die Durchführung eines Bbox-Tests bei einem der Söhne
oder die Entscheidung, ein Sohn-Obel zu malen oder nicht.
Wenn die verdeckten Teile wegfallen sollen, bewirkt ein
bereits gemaltes Pixel die Inaktivierung der von diesem
Pixel verdeckten Obel.
-
Die erwähnte Operation "push" besteht darin, daß der
laufende Zustand der Verarbeitung gewahrt wird, daß die Ebene
inkrementiert wird und daß für einen bestimmten Sohn des
Ziel-Obel der neue Verarbeitungszustand in Abhängigkeit vom
alten errechnet wird.
-
Die genannte Operation "pop" besteht darin, daß die Ebene
dekrementiert wird und daß der bewahrte Zustand der
Verarbeitung in dieser Ebene wieder aufgenommen wird. Die
Verarbeitungsregel ist jetzt, solange die Verarbeitung nicht beendet
ist, wenn die laufende Ebene nicht der Boden ist: den ersten
noch nicht aufgesuchten Knoten des laufenden Knotenpakets,
der den Bbox-Test passiert, suchen, wenn ein solcher Knoten
existiert, einen push ausführen, wenn nicht, wenn man an der
Spitze der Hirarchie ist, ist die Verarbeitung beendet, und
wenn man nicht an der Spitze ist, ist ein pop auszuführen.
Wenn die laufende Ebene der Boden der Hirarchie ist, sind
die Knoten des laufenden Knotenpakets in der
Prioritätsreihenfolge zu projizieren und ist im fortschreitenden Maße
das Bild zu malen, und dann ist ein pop auszuführen.
-
Der Ziel-Octree wird zunächst durchlaufen, indem den dem
Schirm zunächst liegenden Obel vorangegeben wird (was die
Prioritätsreihenfolge definiert: dies ist das sogenannte
"front to back"-Verfahren). Eine Funktion, die "next"
genannt wird, besteht darin, daß nun die zu malenden Obel
ausgewählt werden (im nicht-transparenten Modus), die nicht
von einem bereits gemalten Obel maskiert sind. Ein Obel wird
also nur dann besucht, wenn es tatsächlich auf den
Bildschirm projiziert wird. Im transparenten Modus werden alle
nicht leeren Obel des Objekts aufgesucht.
-
Nun wird eine Ausführungsform der Vorrichtung zur
Durchführung des erfindungsgemäßen Verfahrens beschriebne. Der
Diagrammblock einer solchen vorrichtung ist in Fig. 11 gezeigt.
-
Diese Vorrichtung besitzt im wesentlichen: einen Octree-
Speicher 28, eine Octree-Maske 29, einen geometrischen
Prozessor 30 und einen Bilderzeuger 31 mit seinem zugeordneten
Speicher 32. Die Elemente 29,30 und 31 sind mit dem Octree-
Bus verbunden, der aus einem Adressenbus, einem Datenbus und
zwei im nachstehenden beschriebenen Steuerungen "get node"
und "get property" besteht.
-
Auf diesen Speicher hat man für die gesamte nachfolgende
dasselbe Objekt betreffende Verarbeitung nur zum Lesen
Zugang. Der Octree ist in dem Speicher 28 in einer Form
gespeichert, die es gestattet, ihn schnell auf allen Wegen zu
durchlaufen. Alle Daten, die von dem geometrischen Prozessor
verarbeitet werden, sind immer in derselben Datenstruktur
gespeichert, um schnell und leicht verarbeitet werden zu
können. Der Umfang der zu speichernden Daten kann je nach
dem zu visualisierenden Objekt zwischen etwa 1M
32-Bit-Wörter (2²&sup0; Wörter) bis etwa 32 M 32-Bit-Wörter variieren. Die
Ausführung dieses Speichers und die Mittel, die die Bildung
des Octrees gestatten, gehören nicht zur Erfindung, sie sind
bereits in den genannten Veröffentlichungen beschrieben. Es
sei lediglich gesagt, daß dieser Speicher ein 32-Bit-Wörter-
Ram-Speicher ist.
-
Die Octree-Maske 26 hat die Funktion, sehr schnell die Daten
im geometrischen Prozessor 30 zu liefern. Während auf den
Octree-Speicher 28 in Wortblöcken zugegriffen wird, wird auf
die Maske 29 für ein Knotenpaket (16 Bit) oder für eine
Eigenschaft (32 Bit) zugegriffen. Dank der Struktur der
Daten im Octree-Speicher ist der Grad der Anwesenheit der
Informationen in der Maske 29 sehr hoch, d.h. die Mehrzahl
der zu jedem Zeitpunkt für den Prozessor erforderlichen
Informationen befindet sich in der Maske.
-
Der geometrische Prozessor 30, der im nachstehenden
ausführlich beschrieben wird, gewährleistet die Durchführung des
erfindungsgemäßen Verfahrens und es ist insbesondere er, der
das Durchlaufen des Octrees bestimmt.
-
Der Bilderzeuger 31 errechnet den Wert der zu malenden Pixel
unter der Steuerung durch den Prozessor 30. Ein Pixel an
einer bestimmten Stellung des Bildes wird nur ein einziges
Mal errechnet. Das Bild wird in einem Puffer erzeugt ("frame
buffer", der im nachstehenden unter Bezugnahme auf Fig.25
beschrieben wird), der ein komplettes Bild speichern kann
und bei einem Ausführungsbeispiel ein RAM von 512 x 512
32-Bit-Wörtern (bei Bildern von 512 x 512 Pixel) ist.
-
Die Octree-Maske ist detailliert in Fig. 12 dargestellt.
-
Der im Speicher 28 gespeicherte Octree wird durch einen
Blockleser 33 unter der Steuerung eines Sequenzers 34 (der
die Funktion "fetch" auslöst) gelesen, der im nachstehenden
unter Bezugnahme auf Fig. 14 beschrieben wird. Die Funktion
des Sequenzers 34 ist es, auf Anforderung des geometrischen
Prozessors 30 die im Octree-Speicher gelesenen Werte in
Knotenpaketblöcken in die beiden eigentlichen (mit dem Leser
33 verbundenen) Maskenspeicher 35, 36 zu laden. Diese
Informationen werden anschließend in den Speichern 35, 36 gelesen
und neu adressiert, so daß direkt Werte geliefert werden,
die in Form von "Baum, Ebene, Paket, Knoten" ausgedrückt
sind, entsprechend den Bedürfnissen des geometrischen
Prozessors, der diese Informationen somit direkt verarbeiten
kann.
-
Der Speicher 35, Knotenpaketspeicher genannt, ist in dem
vorliegenden Fall ein Speicher, der 1025 Knotenpakete (auf
16 Bit) speichern kann, die in 8 Bäumen, 16 Ebenen und 8
Paketen organisiert sind und deren Adressen am
Octree-Adressenbus 37 unter den Bezeichnungen "tree" auf 3 Bit, "level"
auf 4 Bit und "packet" auf 3 Bit vorliegen. Auf diese Weise
kann jede Ebene 64 Knotenpakete speichern. Der geometrische
Prozessor 30 wählt in der laufenden Ebene 8 Knotenpakete von
diesen 64 Paketen aus, um den laufenden Overlay zu bilden.
Ein Knotenpaketblock wird an einer Adresse (gegeben durch
die Informationen "tree" und "level") gespeichert, wobei die
"packet"-Adresseninformation 0 bis 7 beträgt. Die
Adressiereingänge des Speichers 35 sind mit den Ausgängen von drei
Multiplexern 38 bis 40 mit jeweils zwei Eingängen verbunden.
Ein erster Eingang des Multiplexers 38 ist mit den
Adressierdrähten "tree" des Bus 37 und sein anderer Eingang ist mit
dem Ausgang eines Stapelspeichers 41 verbunden, der die
Adresse "Vaterbaum" auf 3 Bit liefert. Ein erster Eingang
des Multiplexers 39 ist mit den Adressierdrähten "level" des
Bus 37 verbunden und sein anderer Eingang ist mit dem
Ausgang eines Transkoders 42 verbunden, dessen Eingang mit
denselben
Adressierdrähten "Ebene" des Bus 37 verbunden ist.
Der Transkoder 42, der beispielsweise mit einem Festspeicher
ausgeführt ist, liefert ausgehend von der Adresse "level"
eine Adresse "level-1". Die Programmierung eines solchen
Speichers ist für den Fachmann offenkundig. Ein Eingang des
Multiplexers 40 ist mit den Adressierdrähten "packet" des
Bus 37 und sein anderer Eingang ist mit den Adressierdrähten
"tree" des Bus 37 verbunden. Die Steuereingänge der
Multiplexer sind mit den Ausgängen "select address" des
Sequenzers 34 und des Sequenzers 43 (der die Funktion "get
node" steuert) verbunden.
-
Der Ausgang des Speichers 35 ist über ein Register 44 mit
dem Datenbus 45 (der einen Teil des Octree-Bus bildet)
verbunden. Der Zeitgebersignaleingang des Registers 44 ist mit
einem Ausgang des Sequenzers 43 verbunden.
-
Der Speicher 36, Eigenschaftenspeicher genannt, ist im
vorliegenden Fall ein Speicher, der eine so große Kapazität
hat, 8192 Eigenschaften, die in 8 Bäumen, 16 Ebenen, 8
Paketen und 8 Knoten organisiert sind, zu speichern, wobei
diese Informationen am Adressenbus 37 unter den
Bezeichnungen "tree", "level", "packet" und "node" (letzterer auf 3
Bit) vorliegen. Die Eigenschaften eines Knotenpakets, das an
einer (durch die genannten Informationen "tree", "level" und
"packet" definierten) Adresse gespeichert ist, sind an
Adressen gespeichert, die durch die Informationen "tree",
"level", "packet" gegeben sind, wobei die Adressinformation
"node" 0 bis7 beträgt. Der Speicher 36 wird durch die Drähte
"tree", "level", "packet" und "node" des Bus 37 adressiert
und sein Ausgang ist über ein Register 46 mit dem Datenbus
45 verbunden. Der Zeitgebersignaleingang des Registers 46
ist mit dem Draht 47 "get property", der zum Octree-Bus
gehört, verbunden.
-
Die auf diese Weise adressierten Informationen werden in der
Maske 29 durch einen Validitätsbit verwaltet und den
"parent-tree"-Stapelspeicher 41, der beispielsweise mit
einem RAM ausgeführt ist. Der von einem RAM 48 erzeugte und
durch die Informationen "tree" und "level" adressierte
Validitätsbit gibt an, daß der Knotenpaketblock derselben
Adresse freigegeben ist, d.h. daß die in diesem Block
enthaltenen Daten auf den geometrischen Prozessor 30 übertragen
werden können. Die Adressiereingänge der Speicher 48 und 41
sind mit den Ausgängen von zwei Multiplexern 49, 50 mit
jeweils drei Eingängen verbunden. Die beiden ersten Eingänge
des Multiplexers 49 sind mit den "tree"-Drähten und den
"packet"-Drähten des Bus 37 verbunden und sein dritter
Eingang ist mit einem Ausgang (im vorliegenden Beispiel auf 3
Bit) des Sequenzers 34 verbunden, der eine Information
"tree" liefert, die von 0 bis 7 variiert. Ein erster Eingang
des Multiplexers 50 ist mit den "level"-Drähten des Bus 37
verbunden, sein zweiter Eingang ist über einen Transkoder 51
mit denselben "level"-Drähten verbunden. Der Transkoder 51,
der beispielsweise mit einem Festspeicher ausgeführt ist,
liefert die Information "level + 1" ausgehend von der
Information "level". Der dritte Eingang des Multiplexers 50 ist
auf dieselbe Weise wie der dritte Eingang des Multiplexers
49 verbunden. Die Steuereingänge der Multiplexer 49,50 sind
mit den Ausgängen "select address" des Sequenzers 34,43
verbunden. Der Pointer des "parent-tree"-RAM 41 liefert für
jeden Block, dessen Adresse von "tree" und "level" auf dem
Bus 37 geliefert wird, die jedem Vater-Knotenpaket der
vorhergehenden Ebene entsprechende "tree"-Nummer-Information.
Die Adresse eines Knotenpakets ist, wie oben erläutert
wurde, das Informationen-Triplett ("tree", "level", "packet").
Die Adressen der Eigenschaften der Knoten dieses Pakets sind
durch ("tree", "level", "packet" "node") gegeben, wobei
"node" je nach der Nummer des betrachteten Knotens die Werte
von 0 bis 7 annimmt. Dieses Knotenpaket, Sohn des Knoten mit
der Adresse "node" eines bei der Adresse ("tree", "level",
"packet") befindlichen Knotenpakets hat die Adresse
("packet", "level + 1", "node"). Diese Adressierart
gestattet in einer bestimmten Ebene der Maske die Verwaltung von
Knotenpaketblöcken, die nicht denselben Vater haben, was
erforderlich ist, damit diese Blöcke ein und demselben Overlay
entsprechen. Die Maske wird durch die Signale "get node" und
"get property" jeweils auf 1 Bit gesteuert, die von den
Drähten 52 und 47 des Octree-Datenbus geliefert werden und zum
Sequenzer 43 bzw. zum Register 46 gelangen.
-
Wenn das Signal "get node" aktiviert ist, liest die Maske 29
die Adressen der auf dem Bus 37 auftretenden Knotenpakete
("tree", "level", "packet"). Die Maske 29 führt nun folgende
Etappen aus: der Speicher 48 prüft nach, ob der Adreßblock
("tree", "level") freigegeben ist; wenn er nicht freigegeben
ist, benachrichtigt er den Sequenzer 43, der die Funktion
"fetch" aktiviert, um den richtigen Block zu suchen, indem
er über den Draht 43 dem Sequenzer 34 ein Signal liefert und
auf ein Bestätigungssignal des Sequenzers über den Draht 34
wartet. Diese Aktivierung der Funktion "fetch" ist
schematisch im oberen Teil von Fig. 13 gezeigt und noch einmal
detailliert in Fig. 14 dargestellt. Der Pointer 55 des
Speichers 41 unter der Steuerung des Sequenzers 34 zeigt auf
das Vater-Knotenpaket positioniert, was gemäß der oben
erläuterten Adressierregel die Adresse des freigegebenen Sohn-
Knotenpakets 57 ergibt.
-
Sobald das Bestätigungssignal auf der Verbindung 54 erhalten
wird, bewirkt der Sequenzer 43 über die Verbindung "select
address" und einen der Multiplexer 38 bis 40 die
Adressierung (in "Baum"-, "Level"-, "Packet"-Ausdrücken) des
Speichers 35 und aktiviert dann das Register 44, das das
entsprechende Knotenpaket auf dem Bus 45 liefert (Fig. 13, Diagramm
in der Mitte, für das Knotenpaket 57).
-
Anschließend bewirkt der Sequenzer 43 über die Verbindung
"select address" und die Multiplexer 49 und 50 die neue
Adressierung der Speicher 48 und 41 (Adresse "packet",
"level + 1") , um den "parent-tree"-Pointer mit dem Block der
höheren Ebene nach der Adressierregel der Adresse ("packet",
"level + 1") zu aktualisieren, d.h., daß, wenn, wie in Fig.
13 gezeigt ist, das gesendete Paket die Nummer 2 der Ebene
"level" ist, der Sohn-Block im Baum 2 der Ebene "level + 1"
angeordnet wird. Wenn an dieser Adresse ein freigegebener
Block für einen anderen Vater-Pointer existiert, wird er
über die Steuerung 59 und das "ODER" 60 invalidiert und der
Sequenzer 43 positioniert den Pointer 58 auf der korrekten
"tree"-Adresse.
-
Was die Funktion "get property" anlangt, wird eine
Validitätsnachprüfung in Antwort auf ein Signal "get property"
(Signal auf 1 Bit auf dem Draht 47) durchgeführt, da in dem
Block der Eigenschaften die einzelnen Eigenschaften in der
Reihenfolge der entsprechenden Knoten angeordnet sind und
ihre Adressen verbunden sind. Der Speicher 36 liefert nun
die Eigenschaft, die der Adresse ("tree", "level", "packet",
"node") entspricht, die zu diesem Zeitpunkt auf dem Bus 37
verfügbar ist, und zwar über das Register 46, das durch
dieses Signal "get property" aktiviert wird.
-
Auf einen Befehl "fetch" (von 43 gesendet) eines Blocks, der
sich an der Adresse ("tree", "level") befindet, bewirkt der
Sequenzer 34 (über "select address") die Adressierung der
Speicher 41 und 48 in "tree", "level" durch die Multiplexer
49,50, um die Vater-Baumnummer zu erhalten, und dann löst er
(über "select address") die Adressierung in "parent-tree",
"level - 1", "tree" über die Multiplexer 38 bis 40 des
Speichers 34 aus, um das Vater-Knotenpaket nach der genannten
Adressierregel zu lesen: in Fig. 14 ist der Pointer 62 auf
dieses Vater-Paket 63 gerichtet. Dann liest der Sequenzer 34
die absolute im Octree-Speicher gespeicherte Adresse des
Blocks ("tree", "level") im Speicher 61. Der Speicher 61 ist
mit den Ausgängen der drei Multiplexer 38 bis 40 verbunden
und erhält vom Leseblock 33 die Adressen der Blöcke,
durchlaufen. Der Speicher 61 erstellt ausgehend von der
laufenden Adresse (relativen Adresse) der Knoten und der
entsprechenden Offsets die absolute Adresse dieser Knoten.
-
Anschließend aktiviert der Sequenzer 34 über die
1-Bit-Verbindung 64 den Leser 33, der den Speichern 35, 61 und 32 die
Informationen "Knotenpakete", "Blockadresse" und
"Eigenschaft" zu den absoluten Adressen ("tree", "level", "packet"
von 0 bis 7 und "node" von 0 bis 7) liefert. Fig. 14 zeigt
den Sohn-Block 65 des Pakets 63. Dieser Sohn-Block ist an
der Adresse ("tree", "level") gespeichert, wo der Sequenzer
34 invalidiert. Dann wählt der Sequenzer 34 (über die
Verbindung "select address" der Multiplexer 50 und 49) die
Adressen ("t" = 0 bis 7, "level + 1") der Speicher 41,48
aus. Anschließend invalidiert er die Blöcke der Ebene "level
+ 1", wenn "parent-tree" von "tree" abweicht, was der
Vergleicher 41A ausführt (dessen Eingänge mit "tree" des Bus 37
und mit dem Ausgang des Stapelspeichers 41 verbunden sind
und dessen Ausgang mit den Sequenzern 34 und 43 verbunden
ist), d.h. er invalidiert die Blöcke, die bei einem zum
Block ("tree", "level", Block 65 in Fig. 14) gehörenden
Vater-Knotenpaket gültig waren. In Fig. 14 ist diese
Invalidierung durch Kreuze auf den auf dem Block 65 gerichteten
Pointern 66,67 schematisch dargestellt. Da dieser Block
nämlich geändert wurde, sind die Blöcke der höheren Ebene
("level + 1"), die mit ihm verbunden sind, nicht mehr
gültig. Schließlich sendet der Sequenzer 34 dem Sequenzer 43
auf der Leitung 54 ein Bestätigungssignal und wartet auf ein
anderes Signal "fetch" über die Leitung 53. Der Sequenzer 43
nimmt nun den Ablauf seines Prozesses wieder auf, d.h. den
oben beschriebenen Prozeß nach dem Empfang des
Bestätigungssignals.
-
Die Steuerung der Validität der Blöcke ist automatisch. Die
folgenden Steuerungen werden von der Ebene Null aus
zugelassen:
-
- Sendung einer Steuerung "get node" für durch ("tree",
"level", "packet") definierte Adressen für jede Ebene
("level") zwischen Null und der laufenden Ebene (letzte
angeforderte Ebene).
-
- Sendung einer Steuerung "get prop" für die durch
("tree", "level", "packet", "node") definierten Adressen
einer unter der laufenden Ebene liegenden Ebene, deren
Steuerung "get node" für die Adresse ("tree", "level",
"packet") zuvor durchgeführt wurde.
-
Fig. 15 zeigt den Funktionsdiagrammblock des geometrischen
Prozessors 30 nur mit dem Octree-Datenbus 45 und den
Steuerungen "get property" 47 und "get node" 52.
-
Der geometrische Prozessor besitzt zunächst einen Sequenzer
68, der die Steuerung der einzelnen Stufen des
erfindungsgemäßen Verfahrens gewährleistet. Der Sequenzer 68 nimmt fünf
Grundzustände an, die mit Zustand 0 bis Zustand 4 bezeichnet
sind.
-
Zustand 0: das ist der "Bbox"-Test. In diesem Zustand
steuert der Sequenzer die Durchführung des "Bbox"-Tests für
einen bestimmten Sohn des Ziel-Obel zum Zweck seiner
Bewertung. Der Test ist positiv, wenn der Wert dieses Sohns nicht
"E" ist.
-
Zustand 1: Funktion "push". Der Sequenzer steuert die
Durchführung eines "push" für einen bestimmten Sohn des Ziel-
Obel, wenn der Bbox-Test positiv ist. Der Prozessor wählt
nun den Sohn-Overlay und errechnet die neuen Koordinaten des
neuen Ziels.
-
Zustand 2: Funktion "Pop". Der Sequenzer steuert die
Durchführung dieser Funktion, wenn alle Söhne des laufenden Ziel-
Obel aufgesucht worden sind.
-
Zustand 3: Funktion "test paint" und Erzeugung des Bilds.
Wenn Pixel des Bilds zu malen sind, aktiviert der Sequenzer
die Funktion "Erzeugung des Bilds", die den Wert errechnet,
der dem laufenden Pixel zuzuweisen ist. Die beiden, durch
das gemalte Pixel verdeckten Obel werden gesperrt und werden
also nicht mehr aufgesucht.
-
Zustand 4: "Next". In diesem Zustand bestimmt der Sequenzer
den folgenden aufzusuchenden Sohn des laufenden Obel.
-
Der Sequenz er sowie die anderen Elemente des geometrischen
Prozessors werden durch die folgenden Variablen gesteuert
(Fig. 15):
-
"c-num": Nummer des aufzusuchenden Sohns des laufenden Obel
(0 bis 7).
-
"n-rem": Validitätsbit der Variablen "c-num". Wenn dieses
Bit auf Null ist, so bedeutet dies, daß es keine
aufzusuchenden Söhne des laufenden Obel mehr gibt.
-
"level": Laufende Ebene des Ziel-Octrees.
-
"bottom": Boolesche Zahl, wahr, wenn "level" der Basis des
Octrees entspricht.
-
"top": Boolesche Zahl, wahr, wenn "level" der Spitze des
Octrees entspricht (Ebene 0).
-
"bpass" und "cpass": Bool'sche Zahlen, wahr, wenn der Sohn
mit der Nummer "c-num" des laufenden Obel aufzusuchen ist.
-
"paint": Boolesche Zahl, wahr, wenn der Sohn mit der Nummer
"c-num" des laufenden Obel auf das Bild zu projizieren ist.
-
Der Ausgangszustand der Initialisierung des Sequenzers ist
der Zustand 0, in dem "level" = 0 (Variable "top" wahr), und
"c-num" ist die Nummer des ersten aufzusuchenden Sohns
(Variable "n-rem" = 1). Bei der Ausführungsform mit
Auflösung von 512 x 512 hat man also typisch "c-num" = 7.
-
Die beiden möglichen Übergänge zwischen den einzelnen
Zuständen (bezeichnet mit E0 bis E4) des Sequenzers sind die
folgenden:
-
E0 T E1: "bpass" und "cpass" sind wahr
-
E0 T E4: "bpass" oder "cpass" ist falsch
-
E1 T E0: "bottom" ist falsch
-
E1 T E3: "bottom" ist wahr
-
E3 T E4: ist immer wahr (von E3 geht man zwangsläufig auf
E4 über)
-
E4 T E3: "bottom" ist wahr und "nrem" ist wahr
-
E4 T E2: "top" ist falsch und "nrem" ist falsch
-
E4 T E0: "bottom" ist falsch und "nrem" ist wahr
-
E4 T Ende: "top" ist wahr und "nrem" ist falsch.
-
Der Prozessor 30 besitzt einen RAM-Speicher 69, der die
Funktion "test paint" durchführt.
-
Die Funktion "test paint" (Zustand E3) steuert die Abtastung
des Overlay durch den laufenden Sohn-Obel (mit der durch
"c-num" angegebenen Nummer) . Der Wert von "paint" leitet
sich vom Zustand des entsprechenden Knotens ab ("node
state"). Bei der vorliegenden Ausführungsform werden die
Knoten, deren Zustand "F" ist, gemalt. Die Funktion
Bilderzeugung wird aktiviert, wenn "paint" wahr ist, dann wird das
Bit "c-num" oder "c-num-4" (wenn "c-num" größer als 3 ist)
des Registers "quad status" validiert.
-
Die Funktion Bilderzeugung (Block 70 in Fig. 15) wird im
nachstehenden unter Bezugnahme auf Fig. 25 beschrieben.
-
Die Funktion "test Bbox" gewährleistet die Abtastung des
Overlay für die acht Ecken des Sohns des laufenden Obel.
Wenn eines der Signale "node state" nicht Null ist, ist die
Boolesche Zahl "bpass" wahr. Diese Funktion ist Teil der in
Fig. 15 mit 71 bezeichneten Funktionengruppe und wird im
nachstehenden unter Bezugnahme auf Fig. 24 detaillierter
beschrieben.
-
Die Funktion "push", die insbesondere unter Bezugnahme auf
die allgemeine Fig. 16 im vorstehenden erläutert wurde,
besteht darin, daß die Register mit dem Zustand "target
status" und "target center" (vgl. Fig. 17) in ihren der
laufenden Ebene entsprechenden Stapelspeichern zu sichern,
das Register "quad status" (vgl. Fig. 20) im "quad tree"-
Speicher in der laufenden Ebene an der Adresse "target x",
"target y" zu sichern, den neuen Overlay zusammenzusetzen,
die neuen Werte von "target center" und von "target x",
"target y", "target z" zu errechnen, die laufende Ebene zu
inkrementieren, den neuen Wert von "quad status" in der
neuen laufenden Ebene und an der neuen Adresse "target x",
"target y" zu lesen und den neuen "target status" in
Funktion vom neuen "quad status" zu initialisieren, wobei der
neue "c-num" nun verfügbar ist (vgl. Fig. 18).
-
Die Funktion "pop" (vgl. Fig. 16) besteht darin, daß das
"quad status "-Register im "quad-tree"-Speicher in der
laufenden Ebene an der Adresse "target x", "target y"
gesichert wird, wenn sein Wert FF in Hexadezimal-Darstellung
ist, man zieht den Wert "c-num" (dessen beide Bit mit
niedrigem Stellenwert genügen) des zu kondensierenden
Sohn-Imel heran, dann dekrementiert man die laufende Ebene,
man lädt die Register "target status", "target center" von
ihren jeweiligen Stapelspeichern aus auf die neue laufende
Ebene, man errechnet die neuen Werte "target x", "target y",
"target z", man liest den neuen Wert von "quad status" in
der neuen laufenden Ebene an der neuen Adresse "target x",
"target y" und man führt gegebenenfalls die Kondensierung
durch.
-
Der geometrische Prozessor 30 besitzt ferner eine Funktion
"Geometrie" 72, die im nachstehenden unter Bezugnahme auf
Fig. 17 beschrieben wird, eine Funktion "Schnittebene" 73,
die im nachstehenden unter Bezugnahme auf Fig. 19
beschrieben wird, eine Einheit 74 von drei Registern, die die
Adressen "target x", "target y" bzw. "target z" des Ziel-
Obel liefern, eine Funktion "next" 75, die im nachstehenden
unter Bezugnahme auf Fig. 18 beschrieben wird, und eine
Funktion 76 quad-tree-Lesen/Schreiben, die im nachstehenden
unter Bezugnahme auf Fig. 20 erläutert wird.
-
Der Zustand des geometrischen Prozessors 30 in einer
bestimmten Ebene wird durch die folgenden Register und
Stapelspeicher beschrieben:
-
- "quad status"-Register (vgl. Fig. 20) mit vier Bits, gibt
den Zustand des laufenden Imel des quad tree an,
-
- "c-num"-Register (vgl. Fig. 18) mit drei Bit, gibt die
Nummer des zu besuchenden Sohns des laufenden Obel an,
-
- "target center"-Register mit drei mal 16 Bit (für die drei
Achsen) gibt die Koordinaten des Mittelpunkts des laufenden
Ziel-Obel im Koordinatensystem des laufenden Overlay an,
-
- "last c-num"-Stapelspeicher, speichert alle bereits
besuchten "c-num" für alle niedrigeren Ebenen,
-
- "target center"-Stapelspeicher, speichert alle Werte von
"target center" für alle niedrigeren Ebenen,
-
- "quad tree"-Speicher, speichert alle "quad status" des
"quad tree"-Bilds.
-
Fig. 16 ist ein Prinzipschaltbild der Schaltung zur
Durchführung der Funktion "push" oder der Funktion "pop" je nach der
an einen Multiplexer 77 angelegten Steuerung "push/pop". Der
Ausgang des Multiplexers 77 ist mit dem Eingang eines
Registers 78 verbunden, dessen Zeitgebersignaleingang ein
Signal "Validierung" empfängt. Der Ausgang des Registers 78
ist einerseits mit einer Funktion "Entscheidung" 79 und
andererseits mit einem ersten Eingang des Multiplexers 77 durch
eine "pop"-Schleife 80 verbunden, die einen
Datenstapelspeicher 81 enthält, der durch einen Ebenenwert adressiert ist.
Ein Ausgang der Entscheidungsfunktion ist durch eine "push"-
Schleife 82 mit dem zweiten Eingang des Multiplexers 77
verbunden. Ein anderer Ausgang 83 der Funktion 79 liefert
verschiedene Variablen (vgl. Fig. 17 bis 19).
-
Je nach dem Kreis, in den diese Funktion "push/pop"
eingesetzt ist, enthält das Register 78 die laufenden
Informationen "last c-num", "target center" oder "Schnittebene", die
in der laufenden Ebene zutreffen. Auf eine Steuerung "push"
wird das Register in einem Speicher (Stapelspeicher 81)
gesichert, der durch den Wert der Ebene adressiert ist, die
gerade bestätigt wurde, und dann wird der neue Wert des
Registers ausgehend vom alten errechnet. Auf eine Steuerung
"pop" wird das Register 78 mit dem Wert geladen, der im
Speicher 81 an der Adresse der Ebene gelesen wurde, die
gerade erreicht wurde.
-
Die Geometriefunktion, die in Fig. 17 dargestellt ist, führt
eine Abtastung des Overlay durch. Sie besteht aus drei
Teilen, die für alle drei Koordinaten x,y und z gleich sind.
-
Der durch das Signal "push/pop" gesteuerte Ausgang eines
Multiplexers 84 ist mit dem Register 85 "target center"
(Mittelpunkt des Ziels) verbunden. Der Ausgang des Registers
85 ist einerseits mit einem Eingang des Multiplexers 84 über
einen RAM-Speicher 86, der einen Stapelspeicher für die
"target center"-Werte bildet, und andererseits mit den
Eingängen von zwei Addierern 87,88 verbunden, deren andere
Eingänge jeweilig mit den Ausgängen von Lebendspeichern 89,90
verbunden sind. Der Speicher 89 speichert die
Offset-Höchstwerte der Ecken des Bbox bezüglich des Mittelpunkts des
Ziels und ist durch die sich auf das Ziel beziehende
Variable c-num adressiert. Der Speicher 90 speichert die Offset-
Minimumwerte bezüglich des Mittelpunkts des Ziels der Bbox
und bezüglich des Mittelpunkts des Sohn-Obels und ist durch
das "c-num" des Ziels und durch das Signal "test Bbox"
adressiert.
-
Das Register 85 enthält die Koordinaten des Mittelpunkts des
laufenden Ziel-Obels im Koordinatensystem des laufenden
Overlay. Am Ausgang der Addierer erhält man die Koordinaten des
Mittelpunkts des Sohn-Obels, dessen Offset durch die
Variable "c-num" ausgewählt wird, oder die Koordinaten der acht
Ecken seiner "Bbox". Die die Koordinaten des Sohn-Obel
darstellenden Bits mit den größten Stellenwerten (Stellenwerte
14,13) liefern die Obel- und Knotennummern des zu
verarbeitenden Overlay. Die acht Adressen Obel, Knoten der acht
Ecken eines Bbox werden in einer einzigen Operation unter
Anwendung der Gleichung Nr. 1 errechnet, die oben bei der
Abtastung des Overlay genannt wurde.
-
Die Ausgänge der Addierer k87,88 sind mit einer
Kombinierschaltung 91 mit drei Ausgängen 92,93,94 und einem
Steuereingang 95 verbunden. Der Ausgang des Addierers 88 ist über
eine Schaltung 96, die eine Multiplikation mit 2 durchführt
(die im Grund eine Eliminierung des am wenigsten gültigen
Bits durch Verdrahtung ist), mit dem zweiten Eingang des
Multiplexers 84 verbunden, mit dem auch der Ausgang 94 der
Schaltung 91 verbunden ist.
-
Der neue Mittelpunkt des Ziels wird gemäß der Gleichung Nr.2
errechnet, die oben im Zusammenhang mit den Koordinaten
eines Sohn-Overlay genannt wurde. Das Bit mit dem
Stellenwert 0 des neuen Mittelpunkts des Ziels ist weiterhin Null.
Die Bits mit dem Stellenwert 1 bis 13 sind die alten Bits
mit dem Stellenwert 0 bis 12, wobei diese Operation durch
einfache Verschiebung nach links ausgeführt wird (d.h. durch
die obengenannte Multiplizierung mit 2). Das Bit mit dem
Stellenwert 14 wird in Abhängigkeit vom Fall des neuen
Overlay, also in Abhängigkeit von den alten Bits mit dem
Stellenwert 12,13,14 nach folgender Tabelle bestimmt:
alte Bits b 14 : b 13 : b 12
neues Bit b 14
-
Während eines "push" validiert die Steuerung "assemble" die
für die Berechnung eines neuen Overlay erforderlichen Werte
("obel", "node"). In Abhängigkeit von der Stellung des
Mittelpunkts des Ziels im alten Overlay errechnet man die acht
Adressen ("obel", "node") , und zwar zwei pro
Koordinatenachse der acht Knoten des alten Overlay, um das neue Overlay
zu formen, und zwar gemäß der folgenden Tabelle:
Mittelpunkt des Sohns b 14 : b 13 : b 12
OBEL 0
OBEL 1
Obel Node
-
Die Variable "case" (Fall), die auf 2 Bits am Ausgang 92
verfügbar ist und für die Wahl des neuen Overlay
erforderlich ist (vgl. oben Beschreibung von Fig. 9), ist die
Verkettung der Variablen "obel:node" des Obel 0.
-
Das Steuersignal "assemble" (auf 1 Bit) steuert entweder die
Abtastung des Overlay über den Ausgang 93 (im "Bbox"-Test
und in der Funktion "male") oder den Assembliermodus über
den Ausgang 92, an dem die Fallnummer verfügbar ist, und am
Ausgang 94, an dem das neue Bit mit dem Stellenwert 14 des
Mittelpunkts des Ziels abgenommen wird.
-
Fig. 18 zeigt die Funktion "next" 75. Sie besitzt einen
Multiplexer 97 mit drei Eingängen, dessen Ausgang mit einem
Register 98 verbunden ist (das "c-num" speichert, d.h. einen
der acht Söhne des Ziels). Der Ausgang 99 des Registers 98
ist mit einem ersten Eingang des Multiplexers 97 über eine
"pop"-Schleife 100 verbunden, die einen durch die "level"-
Werte adressierten Stapelspeicher 101 besitzt. Der Ausgang
des Registers 98 ist ferner mit einem Eingang einer
programmierbaren Schaltung "next" 102 verbunden, deren anderer
Eingang das von einer Schaltung 76 kommende Signal "quad
status" (quad tree-Zustand) empfängt. Der Ausgang der
Schaltung
102 ist mit einem anderen Eingang des Multiplexers 97
verbunden. Außerdem wird das Signal "quad status" zu einer
Initialisierungsschaltung 103 gesendet, deren Ausgang mit
dem dritten Eingang des Multiplexers 97 verbunden ist. An
einem anderen Ausgang 104 der Schaltung 102 verfügt man über
die Variable "n rem", die dem Sequenzer 68 zugeführt wird.
-
Das Register 98 enthält die Nummer ("c-num") des
aufzusuchenden Sohn-Obels. Die Schaltung 75 errechnet, wenn sie
aktiviert ist (am Zeitgebersignaleingang des Registers 98
erscheinendes Signal "validation"), die neue "c-num" in
Abhängigkeit von der letzten aufgesuchten c-num und vom Zustand
des "quad status"-Signals, das die bereits aufgesuchten
Sohn-Obel invalidiert. Wenn kein Sohn mehr aufzusuchen ist,
geht die Boolesche Variable "n rem" auf "falsch" über. Die
Steuerung "push" initialisiert den Wert von "c num" in
Abhängigkeit vom "quad status "-Wert. Die Steuerung "pop"
gestattet die Wiederaufnahme in den Stapelspeicher 101 der letzten
"c num", die im neuen Niveau aufgesucht wurde. Eine
Aktivierung der Funktion "next" validiert nun die nächste
aufzusuchende "c num".
-
Die Schaltung 73 zur Schnittebene-Bestimmung von Fig. 19
besitzt einen Multiplexer 105, der durch das Signal
"push"/"pop" gesteuert ist und dessen Ausgang mit einem Register
106 verbunden ist. Der Ausgang des Registers 106 ist
einerseits mit einer "pop"-Schleife 107, die einen durch "level"
adressierten Stapelspeicher 108 besitzt, mit einem Eingang
des Multiplexers 105, andererseits mit einem Eingang eines
Addierers 109 und schließlich mit einem Eingang einer
logischen Schaltung 110 zur Festlegung der Schnittebene
verbunden ist. Der Ausgang des Addierers 109 ist mit einem anderen
Eingang der Schaltung 110 sowie mit dem anderen Eingang des
Multiplexers 105 über eine "push"-Schleife 111 verbunden,
die eine mit zwei Multiplizierern der Schaltung 112
(Verschiebung
nach links) besitzt, wobei ein Ausgang 113 der
Schaltung 110 auch mit diesem anderen Eingang des
Multiplexers 105 verbunden ist. Ein Schnittebenen-Offset-Speicher
114, der durch "c num" adressiert ist, ist mit dem anderen
Eingang des Addierers 109 verbunden. Die Schaltung 110
besitzt zwei weitere Ausgänge (auf 1 Bit) 115,116, auf denen
die Variablen "c-pass" und "c-int" verfügbar sind.
-
Das Register 106 enthält den Wert des oben erläuterten
Abstands D'. Man erhält am Ausgang des Addierers 109 den Wert
des Abstands D' für das durch die Variable "c-num"
ausgewählte Sohn-Obel. Die Stellung der Obel bezüglich der
Schnittebene wird durch zwei Bit determiniert, die die Variablen
"cpass" und "cint" bilden: "cpass ist wahr, wenn das Sohn-
Obel nicht vollständig außerhalb der Ebene ist, und "cint"
ist wahr, wenn das Sohn-Obel die Ebene schneidet.
-
Der neue in das Register 106 eingeführte Wert für die
folgende Ebene ist der Wert des Abstands des ausgewählten Sohn-
Obels multipliziert mit 2, und von der Schaltung 110 wird
eine spezifische Entscheidung für die neuen Bit 14 und 15
getroffen, um die Entscheidung zu stabilisieren, wenn die
Ebene das Obel nicht mehr schneidet. Die Schaltung 110 ist
gemäß der nachstehenden Tabelle programmiert.
Vater b15:b14
Sohn b15:b14
cpass cpass
cint cint
neues b15:b14
die Ebene
schneidet
den Vater
der Vater ist innerhalb
der Vater ist außerhalb
die Ebene schneidet den Sohn
der Sohn geht nach innen
der Sohn geht nach außen
der Sohn bleibt innen
der Sohn bleibt außen
-
Fig. 20 zeigt das Schema der "quad-tree"-Speicherschaltung
76. Dieser Speicher 117 wird durch die Koordinaten "target
x", "target y", "target z" der Ziel-Obel und durch "level"
adressiert. Der Speicher 117 erhält seine Informationen von
einem 4-Bit-Register 118 über eine Schreibschaltung 119 und
wird durch eine Leseschaltung 120 gelesen, die mit einer
Kondensationsschaltung 121 verbunden ist, die andererseits
mit einer Kondensationstestschaltung 122 verbunden ist, die
ihrerseits mit dem Bit des Registers 118 verbunden ist. Die
vier Bits des Registers 118 können durch eine Schaltung 123
auf "1" positioniert werden, die einerseits die Variable
"c-num" und andererseits ein von der im nachstehenden
beschriebenen Schaltung 157 erzeugtes Steuersignal "upd quad"
zur quad-tree-Aktualisierung empfängt.
-
Das quad-tree-Zustandsregister 118 ("quad status") enthält
den Zustand des laufenden Imel (gemalt oder nicht gemalt).
Dieses Register wird auf zwei verschiedene Arten geändert:
-
- wenn die Ebene der Boden ist, wird jedesmal, wenn ein
Pixel gemalt wird, das ihn darstellende Bit auf "1"
gebracht. Während einer Operation "pop" wird ein
Kondensationsschritt ausgeführt. Dieser Schritt besteht darin, daß dem
Imel, von dem alle Söhne gemalt wurden, der Wert "1"
(gemalt) zugewiesen wird.
-
Während eines "push" oder eines "pop" werden die alten Werte
von "quad status" im Speicher 117 in der alten Ebene und an
der alten Adresse "target x", "target y" gesichert und "quad
status" wird durch den in der neuen Ebene und an den neuen
Adressen "target x", "target y" gelesenen Wert
initialisiert. Während eines "pop" ist zusätzlich eine Kondensation
durchzuführen, wenn der alte Wert von "quad status" F ist (F
Hexadezimal = 1:1:1 : 1 binär), d.h. vollständig gemalt.
-
Fig. 21 zeigt einen der Teile der Schaltung 71, und zwar die
Schaltung 124 zur Assemblierung eines Overlay. Die Schaltung
124 besitzt acht Kreise mit gleichen Gattern 125.0 bis 125.7
(die im nachstehenden unter Bezugnahme auf Fig. 22
ausführlich beschrieben werden Die Ausgänge (Signale "adout")
dieser acht Gatter sind einerseits mit einem Multiplexer 126
und andererseits mit einem Multiplexer 127 verbunden. Die
acht Ausgänge des Multiplexers 126 (Signale "adin") sind mit
den Eingängen der Gatterschaltungen 125.0 bis 125.7
verbunden. Andererseits sind die die Information "parent tree" der
acht Signale "adin" darstellenden Bits mit dem Eingang des
Multiplexers 128 verkettet. Der Ausgang des Multiplexers 127
ist mit dem Datenbus 45 verbunden, und er wird durch den
Wert des Signals "obus" der Gatter 125.0 bis 125.7 gesteuert
(vgl. Fig. 22). Eine andere Serie von Eingängen des
Multiplexers 128 ist mit den "data"-Drähten des Bus 45 verbunden.
Der Multiplexer 128 wird durch das Signal "auto" gesteuert.
-
Die Ausgänge "reguest" der Gatter 125.0 bis 125.7 sind mit
mit einer Prioritätszuteilungsschaltung 129 verbunden, deren
Ausgänge "ack" 0 bis 7 mit den entsprechenden Eingängen
dieser Gatter verbunden sind. Diese Gatter erhalten ferner die
Adressen "obel" und "node" von 0 bis 7 und senden Signale
"node state" (Zustand der Knoten). Die Ausgänge bpass 0 bis
bpass 7 dieser Gatter sind mit den Eingängen einer ODER-
Schaltung 130 verbunden, an deren Ausgang man das Signal
bpass von Fig. 15 erhält.
-
Der Multiplexer 126 wird durch das Signal "case"
(Fall-Nummer von 1 bis 27) gesteuert.
-
Die Funktion der Schaltung von Fig. 21 besteht darin, daß im
Baum der Overlays nach unten gegangen wird. Diese Funktion
ist eng verbunden mit dem Adressiermodus des Objekt-Octree
im Maskenspeicher. Man assembliert nämlich in den Speichern
des Overlay nur die Adressen, an denen im Maskenspeicher die
Werte oder die Eigenschaften der Knoten abzufragen sind. Zum
Zeitpunkt der Assemblierung eines neuen Overlay errechnet
man gemäß den Adressierregeln des Octree die Adressen des
Maskenspeichers, an denen man die Informationen über den
Overlay in dem Fall findet, in dem sie angefordert wurden.
Die acht Rechenschaltungen 125.0 bis 125.7, die alle gleich
ausgebildet sind, haben jeweils die Aufgabe, die Adresse
eines Obel des neuen Overlay in Abhängigkeit von der alten
Adresse zu errechnen.
-
Fig. 22 ist ein Funktionsschema eines der acht
Rechenschaltungen, die hier einfach mit 125 bezeichnet ist. Die
Schaltung 125 besitzt ein Netz 131 zum Berechnen der neuen
Adresse, das ausführlich unter Bezugnahme auf Fig. 23
beschrieben wird und das die Daten "adin" erhält. Der Ausgang
des Netzes 131 ist mit einem Stapelspeicher 132 verbunden,
der im vorliegenden Beispiel 16 von dem Netz 131 errechnete
Adressen enthalten kann. Am Ausgang des Stapelspeichers 132
erhält man die Signale "adout". Der
Schreibvalidierungseingang des Stapelspeichers 132 ist mit dem Ausgang einer
Dekodierschaltung 133 "4 zu 16" verbunden, die die Informationen
"level" und "assemble" erhält und das Schreiben des
Stapelspeichers 132 in der Ebene "level + 1" aktiviert.
-
Die Schaltung 125 besitzt ferner eine Schaltung 134, die
ausführlich im nachstehenden unter Bezugnahme auf Fig. 24
beschrieben wird. Die Schaltung 134 erhält die Signale "get
n", "node", "packet", "write", "auto", "Obel-Nummer" und
"obus" und erzeugt an einem Ausgang das Signal "request".
Ein anderer Ausgang der Schaltung 134 ist mit einem ersten
Multiplexer 135 verbunden, auf welchen ein zweiter
Multiplexer 136 folgt. Der Ausgang des zweiten Multiplexers 136
ist mit einem Eingang der Schaltung 131 verbunden und
erzeugt andererseits die Signale "node state" und die "bpass"
von 0 bis 7.
-
Die "obel"-Adressen werden außerdem einer Gruppe 137 von
Gattern mit drei Zuständen zugeleitet, die durch "ack"
gesteuert werden und deren Ausgänge mit der Leitung "obus"
verbunden sind.
-
In einer bestimmten Ebene liefert jede Schaltung 125 die
Adresse "adout" der acht Obel des alten Overlay. In
Abhängigkeit von der Variablen "case" treten diese acht Adressen am
Multiplexer 126 am Eingang jedes der Schaltungen 125 auf, so
daß die Schaltung 125i (i ist 0 bis 7), die die Adresse des
Obel Nummer i errechnen soll, am Eingang die Adresse des
Obel in dem alten Overlay erhält, zu dem es gehört ("adin").
-
Die acht Adressen der acht neuen Obel werden parallel durch
die acht Rechenschaltungen wie die Schaltung 131 errechnet,
von denen eine in Fig. 23 dargestellt ist.
-
Die Schaltung 131 besitzt vier Multiplexer 138 bis 141 mit
zwei Eingängen. Die drei ersten werden durch "node state"
gesteuert, der der Wert "parent value" für das Signal
"adout" wird, und der vierte (141) wird durch "parent value"
des Signals "adin" gesteuert.
-
Der Multiplexer 138 erhält an seinen Eingängen die Werte
"tree" und "packet" von "adin" und erzeugt am Ausgang "tree"
von "adout".
-
Der Multiplexer 139 erhält an seinen Eingängen "level" und
"level + 1" ("level + 1" wird mit Hilfe eines Transkoders
142 erhalten) von "adin" und erzeugt an seinem Ausgang den
"level" von "adout".
-
Der Multiplexer 140 erhält an seinen Eingängen "packet" von
"adin" und "node" von der Maske aus und erzeugt an seinem
Ausgang den "packet" von "adout".
-
Der Multiplexer 141 erhält an seinen Eingängen den "node"
von "adin" und den "node" der Maske und erzeugt an seinem
Ausgang den "node" von "adout".
-
Die Schaltung 131 errechnet die Adressen der acht neuen Obel
auf folgende Weise: die Schaltung 134 errechnet den Wert
"node state" des Knotens im alten Overlay. In allen Fällen
wird dieser "node state" der neue "parent value" von "adout"
(direkte Verbindung, ohne Multiplexer zu passieren, zwischen
"node state" und "parent value" von "adout") . Wenn "node
state" partiell ist (Wert "P"), werden die Multiplexer 138
bis 140 so gesteuert, daß ihre zweiten (mit "P" markierten)
Eingänge aktiviert sind, was folgendes ergibt (wobei die
neuen Werte die von "adout" und die alten Werte die von
"adin" sind):
-
neuer "tree" = alter "packet".
-
neuer "level = alter "level + 1".
-
neuer "packet" = abgefragter node.
-
Wenn "node state" nicht partiell ist, ergibt sich:
-
neuer "tree" = alter "tree".
-
neuer "level" = alter "level".
-
neuer "packet" = alter "packet".
-
Wenn der alte "parent value" partiell ist, wird der
Multiplexer 141 so gesteuert, daß sich ergibt:
-
neuer "node" = abgefragter "node".
-
und im entgegengesetzten Fall wird der Multiplexer 141 so
gesteuert, daß man erhält:
-
neuer "node" = alter "node".
-
Bei Ankunft eines vom Sequenzer 68 gesendeten Steuersignals
"assemble" registriert jede Schaltung 125 die neue auf diese
Weise errechnete Adresse im Adressenstapelspeicher 132 in
der Ebene "level + 1". Nach jeder Assemblierung validiert
eine automatische Phase im Overlay die Obel, deren Vater
nicht partiell ist. Die acht Werte der "parent value" sind
vernetzt, um über einen durch die Variable "auto"
gesteuerten Multiplexer 128 an den Eingang der acht Schaltungen
125.0 bis 125.7 angelegt zu werden.
-
Die in Fig. 24 detailliert dargestellte Schaltung 134
besitzt acht Register 143.0 bis 143.7, die jeweils die acht
Knoten eines Obel speichern, so daß sie zusammen einen
Overlay von acht Obel speichern. Jede (einen Knoten
speichernde) "Zelle" jedes der Register 143.0 bis 143.7 ist
mit dem Ausgang eines Multiplexers verbunden. Die Gruppen
von acht solchen Multiplexern, die einem Register
entsprechen, sind jeweils mit 144.0 bis 144.7 bezeichnet. Bei jedem
der Register 143.0 bis 143.7 ist der erste Eingang jedes der
entsprechenden acht Multipiexer mit zwei der sechzehn Drähte
des Ausgang des Multiplexers 128 (Signal "node-packet")
verbunden, und der zweite Eingang jedes dieser Multiplexer ist
mit den beiden selben Drähten (bei ein und demselben
Register) des Ausgang des Multiplexers 128 verbunden, an
denen der Wert "parent value" erscheint. Alle Multiplexer
werden durch das (vom Sequenzer 68 erzeugte) Signal "auto"
gesteuert, das ihre beiden Eingänge validiert, wenn es wahr
ist. Die acht Ausgänge der Register 143.0 bis 143.7 sind mit
dem Multiplexer 135 verbunden (vgl. Fig. 22).
-
Jedem der Register 143.0 bis 143.7 ist eine
Validierungskombinierschaltung
145.0 bis 145.7 zugeordnet. Die Eingänge
jeder dieser kombinierschaltungen sind mit der vom
Multiplexer 128 kommenden Leitung "parent value", mit der
Steuerung "auto" und mit einem entsprechenden Ausgang einer
Dekodierschaltung 146 "3 zu 8" verbunden, die durch ein vom
Sequenzer 68 erzeugtes Signal "Schreiben" validiert wird.
Der Eingang der Schaltung 146 ist mit dem 3-Zustände-Bus
"obus" verbunden. Die (im Fall der Invalidierung
aktivierten) Ausgänge der Schaltungen 145.0 bis 145.7 sind mit einem
Multiplexer 147 verbunden, der durch den Wert "Obel"
gesteuert wird. Der Ausgang des Multiplexers 147 ist mit einem
ersten Eingang eines UND-Gatters 148 verbunden, dessen
zweiter Eingang mit dem Sequenzer 68 verbunden ist, der ihm je
nach dem Zustand, in dem er sich befindet, eines der Signale
"getn", "Bbox" oder "assemble" liefert. Am Ausgang des
Gatters 148 erhält man das Signal "request", was der
Prioritätszuteilungsschaltung 129 (vgl. Fig. 21) zugeleitet wird.
-
Jede Schaltung 125 kann (von der "Geometrie"-Schaltung 72,
die Teil des geometrischen Prozessors 30 bildet) eine
Adresse ("obel", "node") im laufenden Overlay empfangen.
Wenn eine der Schaltungen 134 auf den Maskenspeicher
zugreifen muß, um einen Wert zu erfahren, erzeugt sie am
UND-Ausgang 148 ein Signal "request". Je nach der Rangstufe der
Schaltung 125, die das Signal "getn" empfängt, können nun
zwei verschiedene Prozesse ablaufen:
-
- wenn die Schaltung 125.0 die Steuerung "getn" empfängt,
sendet sie den Wert "node state" der Schaltung 69 ("test
peint"), sobald das von der Prioiritätszuteilungsschaltung
129 erzeugte Signal "norequest" gültig ist, d.h., sobald
keine Prioritätsanforderung zu dieser Schaltung 129 gelangt.
-
- wenn die Schaltung 125.7 die Steuerung "getn" empfängt,
sendet sie den Wert "node state" der Bilderzeugungsschaltung
70, sobald das Signal "norequest" gültig ist.
-
Wenn jede der Schaltungen 125.0 bis 125.7 ein Signal "Bbox"
(am zweiten Eingang des "UND" 148) empfängt, sendet, sobald
einer von ihnen einen von "E" abweichenden "node state"
erkennt (d.h. gleich "P" oder "F"), seine Schaltung 134 über
das "OU" 130 dem Sequenzer 68 eine wahre Variable "bpass",
was bedeutet, daß der "Bbox"-Test gut ist. Wenn jedoch alle
Variablen "bpass" der acht Schaltungen 125 falsch sind, wenn
das Signal "norequest" gültig ist, so bedeutet dies, daß der
"Bbox"-Test nicht gut ist.
-
Sobald eine der Schaltungen 125 der Schaltung 129 ein Signal
"request" sendet, d.h. sobald in einer der Schaltungen 134
eine der Schaltungen 145 ihren Ausgang validiert, wählt die
Schaltung 129 (vgl. Fig. 21) die Schaltung 125 aus, die zu
bedienen ist, indem das entsprechende Signal "ack" validiert
wird (die Schaltung 129 kann auf jede an sich bekannte Weise
so ausgeführt sein, daß sie die priorität zuteilt, wenn
mehrere gleichzeitige Anforderungen vorliegen, daß
unmittelbar die Priorität einem einzigen Anforderer zugeteilt wird
und daß die Variable "norequest" wahr gemacht wird, solange
keine Anforderung gesendet wird). Die betreffende Schaltung
125 positioniert nun ihre Variable "obel" über ihr Gatter
137 mit drei Zuständen auf dem Bus "obus" mit drei
Zuständen, der die auf dem Octree-Bus über den Multiplexer 127 zu
sendende Adresse auswählt. Wenn der Maskenspeicher die
entsprechenden Daten als Antwort auf diese Adresse sendet, wird
die Variable "node packet" in einem der Register 143.0 bis
143.7 validiert, das der auf "obus" vorhandenen Information
entspricht, und zwar in allen Schaltungen 125.0 bis 125.7.
Schließlich unterdrückt die betreffende Schaltung 125 ihr
Signal "request".
-
Fig. 25 zeigt ein Funktionsschema der Schaltung 70 zur
Bilderzeugung.
Die Schaltung 70 besitzt eine Schaltung 149
"Sichtbarkeit-Aktion" (vgl. Fig. 26), eine Schaltung 150 zur
Berechnung der Schattierung (vgl. Fig. 27A und 27B), eine
Schaltung 151 zur Resultatberechnung (vgl. Fig. 28), eine
Schaltung 152 zum Schreiben des Bildpuffers 153 (vgl.
Fig.29) und eine Wahlschaltung 154, die über einen
Bildspeicher und ein geeignetes Interface mit der Bildröhre
(nicht dargestellt) verbunden ist.
-
Wenn die Schaltung 69 "test peint" entschieden hat, daß die
Imel zu malen sind, sendet sie dem Sequenzer 68 ein Signal
"paint". Der Sequenzer 68 läßt nun der Schaltung 149 über
die Schaltung 71 den entsprechenden Wert des "node state"
zusenden. Um den der Schaltung 153 zu sendenden, zu malenden
Wert zu bestimmen, führen die Schaltungen 149 bis 152 die
folgenden Funktionen aus: Lesen der Eigenschaft des zu
malenden Knoten im Octree-Speicher (wenn die Eigenschaft eine
Dichte ist, entscheiden die Schaltungen, ob sie festgehalten
werden muß), Bestimmung der Natur der zu malenden
Information (Schattierung oder Dichte) in Abhängigkeit von dem Wert
des Knotens, den Eigenschaften des Objekts, der Stellung des
Objekts auf den verschiedenen Schnittebenen und der
Dichteschwellenbildung, dann berechnen diese Schaltungen
gegebenenfalls die Schattierung und kumulieren die Resultate im
Pufferspeicher 153 an der Adresse des zu malenden Pixel.
-
Die Schaltung 149 besitzt, wie in Fig. 26 gezeigt ist, einen
Dichtetranskodierungsspeicher 155, der die Eigenschaft
"Dichte" empfängt ("dn" im vorliegenden Fall auf 12 Bit).
Auf den Speicher 155 folgt ein Speicher 156 zur
Sichtbarkeitsbestimmung, auf den seinerseits eine logische Schaltung
157 zur Erzeugung von Steuervorgängen folgt.
-
Der Speicher 155 gestattet die Wahl der festzuhaltenden
Dichten in Abhängigkeit von den vier möglichen Werten der
Knoten (im vorliegenden Beispiel "E", "P", "F" und "F1").
-
Der Akttionsentscheidungsspeicher 157 entscheidet auf
folgende Weise das Malen jedes Pixel: wenn "dv" und "sv" Null
sind, findet ein Abbruch der Aktion des Malens des Pixels
statt und die Schaltung 70 sendet dem Sequenzer 68 die
Bestätigung seiner "Aktion", ohne tatsächlich gemalt zu haben.
Wenn "dv" wahr ist, wird die Dichte gemalt. Wenn "sv" wahr
ist, wird die Schattierung gemalt. Wenn gleichzeitig "dv"
und "sv" wahr sind, wird die Kombination der Dichte und der
Schattierung gemalt. Diese Entscheidungen gestatten es, das
zu malende Objekt mit Hilfe der Identifikationsbits "id"
(die Teil der Eigenschaften bilden und im vorliegenden
Beispiel in einer Anzahl von vier vorgesehen sind) auszuwählen,
auf einer Schnittebene in Dichte und an anderer Stelle in
Schattierung zu malen, nur die Knoten mit einem gewissen
Wert zu malen, usw....
-
Die Schaltung 156 erzeugt ferner Informationen "cl", die die
Wahl einer zu malenden Farbe gestatten (im vorliegenden
Beispiel Information auf 2 Bit).
-
Fig. 27A zeigt das Schema der Schaltung 150 zur Berechnung
der Schattierung. Die Schaltung 150 besitzt eine Schaltung
158, "get tn" genannt, zur Berechnung der Senkrechten auf
eine Fläche und wird im nachstehenden ausführlich unter
Bezugnahme auf Fig. 27B beschrieben. Die Schaltung 158
empfängt eine Dichteinformation "dn" (die einen Teil der
Eigenschaften bildet) und erzeugt am Ausgang eine
Information "tn" der Senkrechten zu einer Fläche, die zu einem
Multiplexer 159 gesendet wird, der an seinem anderen Eingang
eine Information "sn" (die ebenfalls Teil der Eigenschaften
bildet) empfängt.
-
Der Multiplexer 159 wird durch das von der Schaltung 157
erzeugte Signal "in tn" / "in sn" gesteuert, um den
Berechnungsmodus der senkrechten auszuwählen: "in sn" bewirkt die
Wahl des Werts der senkrechten, der im Objekt-Octree
vorberechnet ist und durch den Wert von "sn" gegeben ist; "in tn"
bewirkt die Wahl des Werts "tn", der in der Schaltung 158
ausgehend vom Wert der Dichte errechnet wird.
-
Der Ausgang des Multiplexers 159 ist mit einem
Transkodierungsspeicher 160 verbunden, der die Normalisierung der von
ihm empfangenen Werte gestattet. Seine drei Ausgänge, die
den drei Koordinatenachsen entsprechen, sind mit
Multiplizierschaltungen 161 bis 163 verbunden, die andererseits mit
drei Speichern 164 verbunden sind, die ihnen den Wert (Lx,
Ly, Lz) der Richtung des Lichts, das das beobachtete Objekt
beleuchtet, liefert, der imk Koordinatensystem des Objekts
ausgedrückt ist. Die Ausgänge der drei
Multiplizierschaltungen 161 bis 163 sind mit einem Addierer 165 verbunden, auf
den ein Transkodierungsspeicher 166 folgt. Die
Multiplizierschaltungen 161 bis 163 errechnen das Skalarprodukt des
Werts der Senkrechten und der Richtung des Lichts, und der
Speicher 166 führt eine Korrektur durch, die die Anpassung
des vom Addierer 165 gelieferten Resultats gestattet,
beispielsweise um den absoluten Wert des Skalarprodukts zu
erhalten, um auf an sich bekannte Weise die Qualität der
Lichtwiedergabe zu verbessern.
-
Der Ausgang des Speichers 166 ist mit einem ersten Eingang
eines Multiplexers 167 verbunden, dessen anderer Eingang mit
dem Ausgang eines speichers 168 verbunden ist, der einen
vorberechneten Schattierungswert liefert, der von dem
Multiplexer 167 ausgewählt wird, wenn das zu malende Pixel auf
einer Schnittebene liegt (Variable "cint" nicht Null).
-
Die Schaltung 158, die detailliert in Fig. 27B dargestellt
ist, besitzt einen Multiplexer 169, von dem ein Eingang das
Dichtesignal "dn" empfängt und dessen anderer Eingang mit
einem Speicher 170 verbunden ist, der abgerundet einen
vorberechneten Dichtewert für jeden Wert E, P, F, F1 der Knoten
liefert, die nicht die Eigenschaft "Dichte" im Octree haben.
Der Multiplexer 179 wird durch die vom Steuerorgan 176
gelieferte Variable "m-prop" gesteuert.
-
Der Ausgang des Multiplexers 169 ist mit einem Eingang eines
Substrahierers 170A verbunden, dessen anderer Eingang mit
dem Ausgang eines Multiplexers 171 verbunden ist. Der
Ausgang des Substrahierers 170A ist mit den Eingängen von drei
Registern 172 bis 174 verbunden, denen jeweilig die drei
Komponenten x, y und z der Knoten der Overlays zugewiesen
sind. Die Ausgänge der Register 172 bis 174 sind mit einem
Schieberegister 175 verbunden. Bei dem vorliegenden
Ausführungsbeispiel sind die Ausgänge der Register 172 bis 174 auf
12 Bit und die Schaltung 175 führt deren gesamte
Normalisierung auf 8 Bit durch. Die Validierungssignaleingänge der
Register 172 bis 174 sind mit einer Steuerschaltung 176
verbunden, die ferner den Multiplexer 171 steuert. Die
Steuerschaltung 176 erzeugt das Signal "get prop" und tauscht mit
der Schaltung 71 die Werte ("obel", "node") aus.
-
Die Schaltung 158 errechnet eine senkrechte im
Koordinatensystem des laufenden Overlays, indem sechs Punkte um den
laufenden Knoten (xo, yo, zo) herum abgetastet werden und
von diesen drei Differenzen durchgeführt werden. Wenn man
den Standort eines Knoten des Overlays durch drei
Komponenten x, y, z von 0 bis 3 bestimmt, werden die drei
Differenzen für diese Komponenten folgendermaßen berechnet: bei der
Achse Ox, indem man diff(x) die Komponente der Differenz der
Dichten in der Achse Ox nennt:
-
- bei xo=1 oder 2: diff(x) = (Dichte (xo+1)-Dichte (xo-1))/2
-
- bei xo=0: diff(x) = Dichte (1)-Dicht (0)
-
- bei xo=3: diff(x) = Dichte (3) - Dichte (2).
-
Auf dieselbe Weise geht man bei diff(y) und diff(z) vor.
Jeder abzutastende Punkt (x,y,z) im Overlay wird direkt in
("obel", "node") kodiert.
-
Die Ergebnisberechnungsschaltung 151 besitzt einen
Dämpfungstranskodierungsspeicher 177, der den Wert der zu
projizierenden Dichte "dn" korrigiert (der beispielsweise im Fall der
Radiographiesynthese erforderlich ist) und dessen Ausgang
mit einem Eingang eines Multiplexers 178 verbunden ist,
dessen anderer Eingang den Wert von "om" (Schattierung)
erhält und der durch den von der Schaltung 157 kommenden
Wert "dn sha" gesteuert ist. Die Schaltung 151 besitzt
ferner einen anderen Transkodierungsspeicher 179, der den Wert
"target z", das signifikanteste Bit der Variablen "c num",
empfängt und durch die (von 157 erzeugte) Variable "dep c"
gesteuert ist. Dieser Traanskodierungsspeicher 179 ist mit
einem Eingang eines Multiplexers 180 verbunden, der an
seinem anderen Eingang den Wert "om" empfängt und durch das von
der Schaltung 157 kommende Signal "sha dep" gesteuert ist.
Die Ausgänge der Multiplexer 178, 180 sind mit einem
Multiplizierer 181 verbunden, dessen Ausgangssignal "rz" genannt
wird und zur Schaltung 152 gesendet wird. Der Speicher 179
gestattet die Berechnung eines tiefen Koeffizienten entweder
für die Dichte (von 177 kommend) oder für die Schattierung.
-
In Abhängigkeit von den Werten von "dv" und "sv", die der
Schaltung 157 zugeführt werden und die Steuersignale "sha
dep" und "dn sha" erzeugen, ist der Wert "rz" am Ausgang des
Muitiplizierers 181:
-
- entweder das Produkt aus korrigierter Dichte und
Tiefenkoeffizient,
-
- oder das Produkt aus Schattierung und Tiefenkoeffizient
-
- oder das produkt aus Dichte und Schattierung.
-
Dem Bildpuffer 153 ist eine Schreibschaltung 152 mit einem
Addierer 182 zugeordnet, der mit dem Ausgang der Schaltung
151 (Signal "rz") und mit einem Ausgang (auf 24 Bit) des
Puffers 53 verbunden ist. Der Ausgang des Addierers 182 ist
mit einem Eingang eines Multiplexers 184 verbunden, dessen
beide anderen Eingänge die Eigenschaft "ad" und die Adressen
"target x", "target y", "target z" sowie "c num" empfangen.
Der Multiplexer 184 wird durch einen der Steuerparameter
"msg", "mad" oder "mpo" gesteuert. Wenn "msg" wahr ist
(Summierungsmodus), enthalten die im Puffer 153
gespeicherten 24 Bit mit niedrigen Stellenwerten jedes Pixel das
Ergebnis der Summe der Signale "rz" und die acht Bit mit hohen
stellenwerten enthalten das Ergebnis der Verkettung der
Signale "cl".
-
Wenn "mad" wahr ist (Adreßmodus), enthalten die 32 Bit jedes
pixel die Adresse des projizierten Obel im Octree-Speicher,
ausgedrückt durch ("Knotennummer im Paket", "Paketnummer im
Block", "Adresse des Blocks").
-
Wenn "mpo" wahr ist (Positionsmodus), enthalten die 32 Bit
jedes Pixel die Koordinaten ("target z", "target y", "target
x") des projizierten obels (drei Felder von 10 Bit).
-
Der Puffer 153 ist durch "target x", "target y" und die
beiden Bit mit niedrigen Stellenwerten von "c num" (mit
"c-num(o)" und "c-num(1)" bezeichnet) adressiert.
-
Im laufenden Betriebsmodus ist "msg" wahr und der
geometrische Prozessor kumuliert das errechnete Ergebnis im Puffer
153 an der Adresse "target x", "target y". Unter den
laufenden Bedingungen kumuliert der Prozessor also vier Ergebnisse
an derselben Adresse, was einem "antialiasing"-Effekt
(Glättung) auf dem Bild bewirkt. Es ist möglich, diesen
Antialiasing-Effekt zu unterdrücken, indem das Ergebnis an
der Adresse ("target x": "c-num(o)") , ("target y"
:-"c-num(1)") geschrieben wird, die der Adresse des gemalten
Pixel in der folgenden Ebene ("level + 1") entspricht.
-
Wenn man die Maskierung der durch den quad-tree projizierten
Obel inaktiviert, erhält man im Puffer 153 das kumulierte
Bild aller Projektionen des Objekts in der betreffenden
Richtung.
-
Die 12 signifikantesten Bits (auf dem gesamten Bild) werden
am Ende der Erzeugung des Bilds dem (mit dem Ausgang von 154
verbundenen) Bildvisualisierungssystem zugeleitet.
-
Die ausgewählten Farben werden beispielsweise auf 8 Bit im
Puffer 153 zusammengestellt. Zwei resultierende Bit werden
am Ende der Bilderzeugung dem Bildvisualisierungssystem
gesendet.
-
Im Fall der Betriebsmoden "mad" und "mpo" werden die 32 Bit
des Puffers 153 einem Verarbeitungssystem gesendet, um
beispielsweise 3D-Meß- oder Ortungsfunktionen zu erzeugen.
-
Die oben beschriebenen Schaltungen gestatten die
Durchführung einer großen Anzahl von Anwendungen dank der
Kombinationen der verschiedenen Arten der Erzeugung eines Bildes
und der positionierung des Objekts, die mit den einzelnen
Betriebsmoden des geometrischen Prozessors und insbesondere
mit dem Speicher 156 (Fig. 26) erreicht werden.
-
Die drei hauptsächlichen Betriebsmoden des geometrischen
Prozessors sind: Adreßmodus, Positionsmodus und
Summiermodus. Außerdem kann man im Summiermodus den transparenten
Modus und den nicht-transparenten Modus unterscheiden.
-
- Adreßmodus (Variable "mad" wahr). In diesem Modus ist das
erzeugte Bild eine Matrix von absoluten Adressen im Octree-
Speicher der Obel des Octrees des gelesenen Objekts. Diese
Adressen sind in folgender Form beschrieben: ("absolute
Adresse des Vaterknotenpakets in dem Block, zu dem der
betrachtete Knoten gehört", "Paketnummer in diesem Block",
"Knotennummer in diesem Paket"). Durch Anpeilen eines Pixels
des Schirms ist es möglich, den Standort eines Obel im
Octree-Speicher zu bestimmen, um beispielsweise seine
Merkmale zu ändern.
-
- Positionsmodus (Variable "mpo" wahr). In diesem Modus ist
das erzeugte Bild eine Matrix von Stellungen (x,y,z) in der
Objektmarkierung der gesehenen Obel. Durch Anpeilung des
Schirms ist es möglich, Messungen eines Objekts im Raum
vorzunehmen.
-
- Summiermodus (Variable "msg" wahr). Dies ist der
Standardbetriebsmodus des Prozessors. Man kann bei ihm zwei
Untermoden unterscheiden:
-
- nicht-transparenter Modus: jedes gemalte Pixel markiert
den quad-tree-Speicher, was die Wirkung hat, daß die nicht
gesehenen Teile des Objekts maskiert werden (die Obel werden
von vorne nach hinten erfaßt).
-
- transparenter Modus: die gemalten Pixel ändern den
quad-tree-Speicher nicht. Hierbei ist es also der
Anfangszustand des quad-tree-Speichers, der die Möglichkeit, die
Pixel zu malen oder nicht, steuert. Insbesondere erhält man,
wenn der quad-tree vollständig Null ist, die laufende Summe
der in der Richtung der Projektion (auf dem Bildschirm)
gesehenen Bilder.
-
Zusätzlich zu diesen Moden, ist, wenn Visualisierungen in
Schattierungen programmiert sind, dem Prozessor anzugeben,
ob die Schattierung "im Flug" ausgehend von der Dichte
berechnet werden soll oder ob die vorberechnete Schattierung
zu verwenden ist.
-
Nun sei die Initialisierung des Prozessors und unter
Bezugnahme auf Fig. 30 die Initialisierung des Maskenspeichers
beschrieben.
-
Die Initialisierung des Prozessors muß bestimmen: die ersten
Ebenen der Maske bis zum Vaterknoten des Octree im Octree-
Speicher, die Zustandsregister des geometrischen Prozessors
in der Ebene 0 ("target center" und Adresse des Overlay in
der Ebene 0 im Maskenspeicher) und die geometrischen
Betriebsparameter: "child offset", "Bbox offset" und "cut
offset" (Offset von D' in Fig. 10).
-
Der Betriebsmodus des geometrischen Prozessors erfordert die
Lösung von zwei Problemen zur Durchführung der
Initialisierung: die Koordinaten eines Punkts des Ziels im Objekt-
Koordinatensystem ausdrücken und den Anfangs-Overlay zu
definieren, so daß das Ziel die Regeln der Einschließung in
den Overlay respektiert.
-
Betrachten wir nun das Objekt, wie es im Octree-Speicher
definiert und bezüglich des Ziels positioniert ist. x,y,z
seien die Koordinaten eines Punkts des Ziels im
Ziel-Bezugssystem. X, Y, Z seien die Koordinaten desselben Punkts im
Objekt-Bezugssystem. Solange die Regel der Einschließung
nicht eingehalten ist, können die Werte X,Y,Z das Intervall
(0,7FFFh) verlassen. Ox, Oy und Oz seien die Koordinaten des
Nullpunkts des Objektbezugssystems im Ziel. R sei die
Drehung und h die Homothetie, die das Objekt aus der
Anfangsstellung heraus erfährt, die es einnimmt, wenn es mit dem
Ziel zusammenfällt. Hierbei erhält man:
-
Die folgenden Schritte dienen dazu, die Einschließungsregeln
einzuhalten.
-
- Erster Schritt: Hinzufügung von zwei Ebenen. Man definiert
in diesem ersten Schritt einen solchen Overlay, daß der
Anfangs-Overlay, der unteilbar ist, und durch das
Vater-Knotenpaket des gespeicherten Octrees dargestellt ist,
eines der 64 Obel des neuen Overlays wird, wobei alle
anderen Obel leer sind.
-
Die Ebene 0 wird geformt von 7 leeren Obel, und ein Obel
Nummer "obel", dessen Sohn mit der Nummer "node" das Vater-
Knotenpaket des Octrees im Octree-Speicher ist.
-
Die Adresse ("obel", "node") ist so bestimmt, daß der
Mittelpunkt des Ziels ("target center") so nahe wie möglich am
Mittelpunkt des neuen Overlay ist.
-
Man nimmt also an jeder der Koordinaten X, Y und Z alle
definierten Punkte im Overlay folgende Transformationen vor:
-
- wenn "target center" kleiner oder gleich -4000h ist,
-
"obel" = 1
-
"node" = 1
-
X = X/4 + 6000h
-
- wenn "target center" größer oder gleich -3FFFh und kleiner
oder gleich 3FFFh ist, erhält man
-
"obel" = 1
-
"node" = 1
-
X = X/4 + 4000h
-
- wenn "target center" größer oder gleich 4000h und kleiner
oder gleich BFFFh ist, erhält man
-
"obel" = 0
-
"node" = 1
-
X = X/4 + 2000h
-
- und wenn "target center" größer oder gleich C000h ist,
erhält man
-
"obel" = 0
-
"node" = 0
-
X = X/4.
-
Zweiter Schritt: Hinzufügung einer Ebene, solange das Ziel
nicht im Overlay eingeschlossen ist. Wenn die
Einschließungsregeln in dieser Ebene nicht bestätigt sind, entweder weil
ein Teil des Ziels außerhalb des Overlays liegt oder weil
das Ziel zu groß ist, fügt man dem Overlay konzentrisch eine
Ebene hinzu. Solange die Einschließungsregel nicht bestätigt
ist, führt man die Transformation aus:
-
X = X/2 + 2000h
-
Von mehreren möglichen Lösungen zur Initialisierung des
Maskenspeichers wird im nachstehenden unter Bezugnahme auf
Fig. 30 eine beschrieben. Diese Lösung gestattet die
Auffindung einer sich wiederholenden Initialisierungsstruktur
unabhängig von der Anzahl hinzugefügter Ebenen. Im Beispiel
der Fig. 30 ist vorausgesetzt, daß das Vater-Knotenpaket in
dem ersten Schritt im Obel Nummer "obel" und im Knoten
Nummer "node" positioniert wurde.
-
Der erste Schritt initialisiert zwei Ebenen, und jeder
folgende Schritt initialisiert nun eine zusätzliche Ebene.
-
Die Ebene 1 des Vater-Knotenpakets des Octrees im Octree-
Speicher ist also gleich 1, wenn nur der erste Schritt
ausgeführt wird, und wird bei jedem anschließend durchgeführten
zweiten Schritt mit 1 inkrementiert.
-
Die bis zur Ebene 1 eingeschriebenen Informationen müssen
validiert werden und die absolute Adresse des Sohns des
Vater-Knotenpakets im Maskierspeicher der Adressen muß
geändert werden. Nach diesem Schritt ist der Overlay des
geometrischen Prozessors zu initialisieren, so daß der Obel
Nummer "obel" einen partiellen Vater hat und die
Maskenadresse ("tree" = "7-obel", "packet" = "7-obel" im Beispiel
von Fig. 30) des es beschreibenden Blocks kennt.