Wir wissen inzwischen, daß Kindelemente die Benannten Strukturen ihrer Eltern "erben" - was auch notwendig ist, wenn man seine Szene nicht mit BS-Tags überschwemmen will. Die Frage stellt sich, wie man ein Kindelement von dieser Vererbung ausschließen kann. Gäbe es keine solche Option, würden die kinematischen Bedingungen (nämlich die Struktur des Objektbaums) einen großen Teil der Benannten Strukturen bereits festlegen. Alle Kindelemente eines Objekts würden zwangsweise zur selben Benannten Struktur gehören, und wir wären in der Freiheit unserer BS-Wahl stark behindert.
Aber natürlich gibt es solch eine Möglichkeit. Die Lösung ist simpel. Wenn das Elternobjekt eine BS "rot" definiert, kann das Kind die Anti-BS "!rot" benutzen - gleicher Name, mit einem vorangestellten Ausrufezeichen. (Programmierer aktueller Programmiersprachen wie C++ oder Java werden dieses Symbol sofort als logisches "Not" oder "Nicht" erkennen - nennen wir es in diesem Zusammenhang "Nicht-Flag".) Dies schließt das Kind - und all seine Kinder - aus dieser Benannten Struktur aus. Natürlich können Kinder dieses Kindes ihrerseits wieder den BS-Namen "rot" benutzen und sich damit wieder in die BS einreihen. Wenn ein Objekt kein eigenes Tag hat oder einen bestimmten BS-Namen in seinen Tags nicht verwendet, gilt immer die Vorgabe des nächsthöheren Elternelements.
Versuchen Sie nicht, den Schlaukopf zu spielen und "rot" sowie "!rot" in den BS-Tags desselben Objekts zu definieren, egal ob in einem Tag oder in verschiedenen. Das Resultat eines solchen Tricks ist undefiniert und hängt sowohl von der Reihenfolge der Namen und Tags als auch von der Programmierung der intern ausgeführten Funktion ab (die sich jederzeit mit einer neuen Version ändern kann).
Bemerkung: Wenn Sie die BS-Sichtbarkeitsfunktionen benutzen, werden Kinder mit Anti-BS-Namen explizit aus der BS ausgeschlossen, und ihre individuelle Sichtbarkeit wird entsprechend gesetzt. Benutzen Sie hingegen die BS-Selektionsfunktionen, werden Kinder immer noch indirekt durch ihre selektierten Elternelemente selektiert, auch wenn sie den Anti-BS-Namen tragen. Es ist nicht möglich, ein Elternobjekt zu selektieren, aber nicht die Kinder. Dies ist eine (verständliche) Beschränkung des Cinema-Selektionsmodells. Benutzen Sie die Option "Auch Kindelemente", so werden Sie den Unterschied anhand der dunkelrot/hellrot gefärbten Namen erkennen können.
Noch eine Bemerkung: Wenn Sie scharf hinsehen, werden Sie erkennen, wie ähnlich sich Benannte Struktur-Tags und die Sichtbarkeitsflags sind. Ein einzelner BS-Name ist das Äquivalent eines "Sichtbar"-Flags. Derselbe Name als Anti-BS-Name (also mit "Nicht-Flag") entspricht dem "Unsichtbar"-Zustand. Und ein Objekt, das diesen BS-Namen gar nicht trägt (weder als Name noch als Anti-Name), verhält sich wie mit einem "Unverändert"-Flag (oder besser, "Ererbt"-Flag). Genau wie es bereits zwei verschiedene Sichtbarkeits-Tags gibt (eins für den Editor und eins für den Renderer), ergibt auch jeder neue BS-Name wiederum ein solches Flag, und da man sich beliebig viele Benannte Strukturen definieren kann, erhält man auch eine beliebige Anzahl dieser Flags.
Beachten Sie, daß die BS-Namen jeder für sich betrachtet werden müssen. Wenn ein Elternelement die BS-Namen A und B definiert und ein Kind dieses Elements !A, dann gehört das Kind nicht zur Benannten Struktur A, die es explizit ausschließt, aber sehr wohl zur Benannten Struktur B. Auf die Tags kommt es dabei nicht an - jedes Tag kann beliebig viele Namen und Anti-Namen enthalten. So etwas wie "Anti-Tags" gibt es nicht, nur Anti-Namen.
Im Beispiel finden Sie Anti-BS-Namen unterhalb der roten Pyramide am Ende des Objektbaums. Die fünf Kugeln, die die Ecken der Pyramide überdecken, sind selbst natürlich keine Pyramiden, aber sie würden die Benannten Strukturen "pyramid" (Pyramide) und "pointy" (spitz) von ihrem Elternelement erben. Daher beinhaltet die Gruppe der Kugeln (Nullobjekt) in ihrem BS-Tag die Anti-Namen "!pyramid !pointy" und schließen sich damit von diesen Benannten Strukturen aus.
Versuchen Sie, mittels "Alle außer diesen" die Sichtbarkeit der Szene über die BS "pyramid" zu setzen. Die rote Pyramide bleibt sichtbar, aber die Kindelemente nicht. Ungekehrt schließen sich die Kugeln nicht aus der Benannten Struktur "red" (rot) aus. Verifizieren Sie auch das.
Das letzte und vielleicht mächtigste Feature in der Benannten Struktur-Kontrolle sind die BS-Ausdrücke. Nach all diesen Beispielen haben Sie sich vielleicht schon gefragt: Gut, ich kann jetzt alle Pyramiden sichtbar machen, und auch alle grünen Objekte, aber kann ich auch die Objekte sichtbar machen, die sowohl grün als auch Pyramide sind?
Ja, können Sie.
Tippen Sie "pyramid & green" ins Eingabefeld.
Tatsächlich ist das Eingabefeld nicht auf einzelne Namen beschränkt - es ist ein kompletter Parser für logische Ausdrücke, die Benannte Strukturen enthalten. Sie können BS-Namen per Oder, Und, sowie Nicht kombinieren. Sie können darüber hinaus Klammern setzen, um die Auswertungsreihenfolge zu bestimmen.
Die benutzten Symbole sind:
Die Symbole sind allesamt abgeleitet aus Programmiersprachen (oder geklaut, wenn Sie so wollen). Benutzen Sie immer die Symbole - die Wörter und, oder, oder nicht werden vom Parser als Namen Benannter Strukturen erkannt statt als Operatoren!
Beachten Sie, daß das "Nicht-Flag"-Symbol "!" sowohl für die Anti-BS-Namen in den Tags benutzt wird, als auch für das Nicht in Ausdrücken. In beiden Fällen kehrt es die Bedeutung des Namens um. Aber begehen Sie nicht den Fehler, zu denken, daß "!green" in einem Ausdruck bedeutet: "Alle Objekte, bei denen der Anti-Name !green gesetzt ist". So etwas gibt es nicht - Anti-BS kann man nicht setzen. Ein Anti-BS-Name schließt lediglich ein Objekt aus einer bestehenden, über Elternelemente ererbten Benannten Struktur aus, aber er definiert selbst keine Struktur. Ein Objekt, in dem "!green" in einem Tag vorkommt, unterscheidet sich aus Sicht der Dialogfunktionen nicht von einem Objekt, wo "green" nirgendwo im Objekt oder seinen Eltern gesetzt wurde.
Mit diesem Wissen können Sie jetzt versuchen, Ihre eigenen Ausdrücke zusammenzustellen. Versuchen Sie "pyramid & green | cube & !red", um alle grünen Pyramiden und alle nicht-roten Würfel zugleich sichtbar zu machen (& bindet stärker als |). Wenn Sie an der Auswertungsreihenfolge der Ausdrücke zweifeln, benutzen Sie Klammern: "cylinder & (green | cube) & blue" wird z.B. kein einziges Objekt sichtbar machen (finden Sie heraus, warum...).
Die Ausdrücke sind für sich genommen schon ein mächtiges Werkzeug, aber sie können noch ein bißchen mehr. Sie unterstützen auch Wildcards (Platzhalter) in Namen. Sie kennen Platzhalter vielleicht bereits aus Kommandozeilen in Ihrem Computer, oder von Suchen-und-Ersetzen-Methoden in ausgereiften Textverarbeitungsprogrammen, oder Sie sind sogar mit dem "großen Bruder" der Wildcards vertraut, den sogenannten Regulären Ausdrücken.
Was ist ein Platzhalter? Kurz gefaßt ist es ein besonderes Zeichen, das für "jedes beliebige andere Zeichen" oder "jede beliebige Folge anderer Zeichen" steht. In unserem Fall ist ersteres das Fragezeichen (?) und das zweite das Doppelkreuz (#).
Das heißt: Wenn Sie color# anstatt des vollständigen Namens einer Benannten Struktur in einem Ausdruck hinschreiben, erkennt das Plugin beim Vergleich der BS-Namen für dieses Muster die Namen colorRed, colorBlue, colorTag, colorization, und so weiter. Es paßt auch auf color, da das Doppelkreuz auch für eine leere Zeichenfolge stehen kann. Wenn Sie color? schreiben, wird dieses Muster auf color1, colorA, colors, oder colore passen (aber nicht colored oder colorBlue, da das Fragezeichen nur für ein einzelnes Zeichen stehen darf).
Sie können ? und # an beliebiger Stelle in einem Namen benutzen, so oft Sie wollen. Ein # am Ende eines Namens zu setzen heißt "jede Benannte Struktur, die mit <Name> beginnt". Ein # am Anfang eines Namens zu setzen heißt "jede Benannte Struktur, die mit <Name> endet". Ein # am Anfang und Ende eines Namens zu setzen heißt "jede Benannte Struktur, die ein <Name> enthält". Ein einzelnes # steht für jede beliebige Benannte Struktur.
Fragezeichen können in Gruppen vorkommen: c???r repräsentiert jede Benannte Struktur, die mit einem c beginnt, mit einem r endet, und dazwischen genau drei beliebige Buchstaben enthält. (Mit dem Doppelkreuz macht das keinen Sinn, weil ein einzelnes Doppelkreuz ja schon eine Folge von Zeichen bedeutet: c#r ist dasselbe wie c###r.)
Was ist jetzt die praktische Anwendung von Wildcards? Ganz einfach. Indem man strikte Namenskonventionen für seine Benannten Strukturen einhält, kann man hinterher über Wildcards Teile dieser Namen auswählen, ohne dafür jeweils eigene Benannte Strukturen für jede Untermenge zuweisen zu müssen. Als Beispiel: Wenn Sie Benannte Strukturen wie rot, blau, weiß benutzen, werden Sie selten eine Anwendung für Platzhalter finden. Wählen Sie hingegen Namen wie farbe_hell_gelb, farbe_grauton_mittelgrau, farbe_primär_blau, dann können Sie alle Farbtags mittels farbe# anwählen, alle Grautöne über #grauton#, oder alle Primärfarben über #primär#.
Ist das notwendig? Genausogut könnten Sie die verschiedenen Namen farbe, hell, grauton, primär, blau und so weiter definieren und damit ein Objekt mehreren Benannten Strukturen zuordnen. Das erfordert dasselbe Maß an Sorgfalt bei der Wahl der Namen und ist natürlich immer eine Alternative. Eine Namenskonvention wie oben allerdings stellt sicher, daß ein Objekt stets einen Farbmodifikator wie hell oder primär besitzt, und stets einen Farbnamen wie blau oder mittelgrau, aber niemals mehr als einen Farbmodifikator oder mehr als eine Farbe. Ein gemeinsames Schema für solche Namensteile in einer Benannten Struktur zusammenzufassen macht die zugrundeliegende Idee besser sichtbar, und wird Sie stets daran erinnern, Ihre Szenen ingenieursmäßig zusammenzustellen ;-)
Aber wie gesagt, es gibt immer mehrere Wege zum Ziel, und ob das nun die Verwendung von Platzhaltern oder Mustern oder Benannten Strukturen überhaupt ist, sei Ihnen überlassen.
(Als kleine Randbemerkung: Sie fragen sich vielleicht, warum ich hier nicht dieselben Platzhalter benutze, wie sie etwa im DOS-Prompt verwendet werden: zwar hat das Fragezeichen dieselbe Bedeutung, aber normalerweise steht statt des Doppelkreuzes ein Asterisk (*). Nun, der Asterisk ist bereits als Multiplikationszeichen vergeben. Der Ausdrucksparser in diesem Dialog kann tatsächlich weitaus komplexere Dinge analysieren als die logischen Ausdrücke, die oben vorgestellt wurden. Um Konflikte zu vermeiden, habe ich sicherheitshalber für den Platzhalter ein eigenes Zeichen gewählt, das sonst nirgendwo benutzt wird. Zwar nutzt das Plugin zur Zeit keine Multiplikation, aber spätere Erweiterungen der Collie Tools könnten das tun.)
Der vierte Abschnitt im Dialog zeigt drei Schaltflächen: "Setze (in erstem)", "Setze (in neuem)", und "Entfernen". Dies sind Hilfsfunktionen, die es erlauben, BS-Tags bzw. BS-Namen in mehreren Objekten zugleich zu setzen.
Sie können alle BS-Tags per Hand setzen, indem Sie diese Tags über das Kontextmenu des Objekts generieren. Sie können die BS-Namen in einem Tag direkt im Attributmanager editieren. Sie können per Drag&Drop ein fertiges Tag auf die gewünschten Objekte ziehen und kopieren. Aber mitunter ist das mühsam, gerade bei vielen Objekten und großen Hierarchien.
Die Schaltflächen-Funktionalität erlaubt es, die Benannten Strukturen aller selektierten Objekte zugleich zu manipulieren. Geben Sie einen BS-Namen oder eine Liste von BS-Namen im Eingabefeld des Dialogs ein (nicht als Ausdruck wie in den zuvor beschriebenen Funktionen, sondern in der Form, wie sie im Tag stehen, evtl. einschließlich eines "Nicht-Flags"). Betätigen Sie dann eine Schaltfläche.
Ein paar Hinweise sind angebracht:
Erstens werden Sie feststellen, daß diese Funktionen mit einer gewissen Intelligenz ausgestattet sind. Wenn ein Name bereits in einem der BS-Tags des Objekts existiert, wird es nicht nochmals hinzugefügt ("Setzen (in neuem)" wird dann eventuell kein zusätzliches Tag erzeugen). Wenn der Name existiert, jedoch mit dem gegenteiligen "Nicht-Flag" (!rot existiert, and rot soll gesetzt werden, oder rot existiert, und !red soll gesetzt werden), dann wird kein neuer Name hinzugefügt, sondern der existierende Name schaltet sein "Nicht-Flag" ein oder aus, um den neuen Zustand widerzuspiegeln. Der Name wird in dem Tag stehen bleiben, in dem er vorher auch war. Die Funktionen begutachten alle vorhandenen Benannte Struktur-Tags eines Objekts und versuchen, dieselbe Reihenfolge von Namen und Tags wiederherzustellen, wenn sie die Änderungen durchgeführt haben. Nachdem ein Name entfernt wurde, können Tags leer sein; diese Tags werden automatisch gelöscht.
Zweitens berücksichtigen die Funktionen nicht die vererbten Benannten Strukturen. Wenn der BS-Name rot gesetzt werden soll, werden die Funktionen nicht in den Tags der Elternelemente nachsehen, ob diese Benannte Struktur darin bereits vorkommt und an das aktuelle Objekt bereits vererbt wird. Der Name wird dem Objekt hinzugefügt, selbst wenn es nicht unbedingt nötig wäre. Die Funktionen nehmen an, daß Sie die vorliegenden markierten Objekte ausdrücklich zu dieser Benannten Struktur hinzufügen wollen, und gehorchen Ihrem Wunsch. Ebenso bedeutet das Entfernen eines BS-Namens aus den Tags nicht unbedingt, daß das Objekt aus einer Benannten Struktur entfernt wird: ein Elternobjekt trägt vielleicht bereits ein entsprechendes Tag, und das Kind erbt diese BS, selbst nachdem das eigene Tag entfernt worden ist.
Und drittens, aus genau diesem Grund entspricht das Setzen und Entfernen eines Tags oder eines BS-Namens nicht hundertprozentig dem Hinzufügen oder Entfernen eines Objektes in einen / aus einem Layer. Sie können das Layer-Konzept als vereinfachte Metapher für Benannte Strukturen ansehen, wenn Sie wollen. Läßt man das Vererben von Benannten Strukturen über BS-Namen und Anti-BS-Namen außer Acht, bedeutet in der Tat das Setzen eines BS-Namens das Hinzufügen des Objektes zu einem Layer, und das Entfernen eines BS-Namens bedeutet das Entfernen des Objektes aus dem Layer. Vererbung eingerechnet, wird die Lage etwas komplexer (was aber gleichzeitig auch die Stärke der Benannten Strukturen gegenüber dem einfacheren Layer-Konzept ist). Sollten Sie bei Ihrer Arbeit irgendwann beim Setzen oder Entfernen eines BS-Namens nicht die erwünschten Resultate erzielen, denken Sie für einen Moment darüber nach und prüfen Sie die Vererbungsstruktur. Sie werden den Grund für den Fehler sicher rasch finden.