Szene-Graph

Ein Szene-Graph ist eine allgemeine Datenstruktur, die allgemein durch Vektor-basierte Grafikredigieren-Anwendungen und moderne Computerspiele verwendet ist. Beispiele solcher Programme schließen Akrobaten 3D, Adobe Illustrator, AutoCAD, CorelDRAW, OpenSceneGraph, OpenSG, VRML97 und X3D ein.

Der Szene-Graph ist eine Struktur, die das logische und häufig (aber nicht notwendigerweise) Raumdarstellung einer grafischen Szene einordnet.

Die Definition eines Szene-Graphen ist kraus, weil Programmierer, die Szene-Graphen in Anwendungen — und, insbesondere die Spielindustrie durchführen — die Kernprinzipien nehmen und diese anpassen, um besonderen Anwendungen anzupassen. Das bedeutet, dass es keine Einigkeit betreffs gibt, wie ein Szene-Graph sein sollte.

Ein Szene-Graph ist eine Sammlung von Knoten in einem Graphen oder Baumstruktur. Ein Knoten kann viele Kinder, aber häufig nur einen einzelnen Elternteil mit der Wirkung eines auf alle seine Kinderknoten angewandten Elternteils haben; eine Operation, die auf einer Gruppe automatisch durchgeführt ist, pflanzt seine Wirkung allen seinen Mitgliedern fort. In vielen Programmen, eine geometrische Transformationsmatrix vereinigend (sieh auch Transformation und Matrix), an jedem Gruppenniveau und dem Verketten solchen matrices ist zusammen eine effiziente und natürliche Weise, solche Operationen zu bearbeiten. Ein gemeinsames Merkmal ist zum Beispiel die Fähigkeit, verwandte Gestalten/Gegenstände in einen zusammengesetzten Gegenstand zu gruppieren, der dann bewegt, umgestaltet, usw. so leicht ausgewählt werden kann wie ein einzelner Gegenstand.

Es geschieht auch, dass in einigen Szene-Graphen ein Knoten eine Beziehung zu jedem Knoten einschließlich sich oder mindestens eine Erweiterung haben kann, die sich auf einen anderen Knoten (zum Beispiel PhotoRealistic von Pixar RenderMan wegen seines Gebrauchs von Reyes bezieht, der Algorithmus oder Adobe Systems's Acrobat 3D für die fortgeschrittene interaktive Manipulation macht).

Szene-Graphen in Grafikredigieren-Werkzeugen

Im Vektor-basierten Grafikredigieren vertritt jeder Blatt-Knoten in einem Szene-Graphen eine Atomeinheit des Dokumentes, gewöhnlich eine Gestalt wie eine Ellipse oder Pfad von Bezier. Obwohl Gestalten selbst (besonders Pfade) weiter in Knoten wie Fugenbrett-Knoten zersetzt werden können, ist es praktisch, um an den Szene-Graphen, wie zusammengesetzt, aus Gestalten zu denken, anstatt zu einer niedrigeren Ebene der Darstellung zu gehen.

Ein anderes nützliches und benutzergesteuertes Knotenkonzept ist die Schicht. Eine Schicht handelt wie eine durchsichtige Platte, auf die jede Zahl von Gestalten und Gestalt-Gruppen gelegt werden kann. Das Dokument wird dann eine Reihe von Schichten, von denen einige unsichtbar, verdunkelt günstig gemacht werden kann, oder hat sich schließen lassen (hat read-only-gemacht). Einige Anwendungen legen alle Schichten in eine geradlinige Liste, während andere Teilschichten (d. h., Schichten innerhalb von Schichten zu jeder gewünschten Tiefe) unterstützen.

Innerlich kann es keinen echten Strukturunterschied zwischen Schichten und Gruppen überhaupt geben, da sie beide gerade Knoten eines Szene-Graphen sind. Wenn Unterschiede erforderlich sind, würde eine allgemeine Typ-Behauptung in C ++ eine allgemeine Knotenklasse machen, und dann Schichten und Gruppen als Unterklassen ableiten sollen. Ein Sichtbarkeitsmitglied würde zum Beispiel eine Eigenschaft einer Schicht, aber nicht notwendigerweise einer Gruppe sein.

Szene-Graphen in Spielen und 3D-Anwendungen

Szene-Graphen sind für moderne Spiele mit und immer größeren 3D-Grafikwelten oder Niveaus nützlich. In solchen Anwendungen vertreten Knoten in einem Szene-Graphen (allgemein) Entitäten oder Gegenstände in der Szene.

Zum Beispiel könnte ein Spiel eine logische Beziehung zwischen einem Ritter und einem Pferd definieren, so dass der Ritter als eine Erweiterung auf das Pferd betrachtet wird. Der Szene-Graph würde einen 'Pferd'-Knoten mit einem ihm beigefügten 'Ritter'-Knoten haben.

Sowie die logische Beziehung beschreibend, kann der Szene-Graph auch die Raumbeziehung der verschiedenen Entitäten beschreiben: Der Ritter bewegt sich durch den 3D-Raum, wie sich das Pferd bewegt.

In diesen großen Anwendungen sind Speichervoraussetzungen Hauptrücksichten, wenn sie einen Szene-Graphen entwerfen. Deshalb vieler großer Szene-Graph-Systemgebrauch, der als Beispiel anführt, um Speicherkosten und Zunahme-Geschwindigkeit zu reduzieren. In unserem Beispiel oben ist jeder Ritter ein getrennter Szene-Knoten, aber die grafische Darstellung des Ritters (zusammengesetzt aus einem 3D-Ineinandergreifen, Texturen, Materialien und shaders) wird als Beispiel angeführt. Das bedeutet, dass nur eine einzelne Kopie der Daten behalten wird, im dann durch irgendwelche 'Ritter'-Knoten im Szene-Graphen Verweise angebracht wird. Das erlaubt ein reduziertes Speicherbudget und vergrößerte Geschwindigkeit seitdem, wenn ein neuer Ritter-Knoten geschaffen wird, die Äußer-Daten braucht nicht kopiert zu werden.

Szene-Graph-Durchführung

Die einfachste Form des Szene-Graphen verwendet eine Reihe oder verbundene Listendatenstruktur, und das Anzeigen seiner Gestalten ist einfach eine Sache, geradlinig die Knoten eins nach dem anderen zu wiederholen. Andere allgemeine Operationen, wie Überprüfung, um zu sehen, welche Gestalt den Maus-Zeigestock durchschneidet (z.B, in GUI-basierte Anwendungen) werden auch über geradlinige Suchen getan. Für kleine Szene-Graphen neigt das dazu zu genügen.

Größere Szene-Graphen veranlassen geradlinige Operationen, merklich langsam zu werden, und so werden kompliziertere zu Grunde liegende Datenstrukturen, die populärste und Standardform verwendet, die ein Baum ist. In diesen Szene-Graphen wird das zerlegbare Designmuster häufig verwendet, um die hierarchische Darstellung von Gruppenknoten und Blatt-Knoten zu schaffen.

Gruppenknoten — Können jede Zahl davon beigefügten Kinderknoten haben. Gruppenknoten schließen Transformationen und Schalter-Knoten ein.

Blatt-Knoten — Sind Knoten, die wirklich gemacht werden oder die Wirkung einer Operation sehen. Diese schließen Gegenstände, Elfen, Töne, Lichter und irgendetwas ein, was 'gemacht' in einem abstrakten Sinn betrachtet werden konnte.

Szene-Graph-Operationen und Absendung

Die Verwendung einer Operation auf einem Szene-Graphen verlangt eine Weise, eine auf einem Typ eines Knotens gestützte Operation zu entsenden. Zum Beispiel, in einer machen Operation, würde ein Transformationsgruppenknoten seine Transformation durch die Matrixmultiplikation, Vektor-Versetzung, quaternions oder Winkel von Euler ansammeln. Nach dem ein Blatt-Knoten den Gegenstand wegschickt, um zum renderer zu machen. Einige Durchführungen könnten den Gegenstand direkt machen, der die zu Grunde liegende Übergabe-API, wie DirectX oder OpenGL anruft. Aber da die zu Grunde liegende Durchführung der Übergabe-API gewöhnlich an Beweglichkeit Mangel hat, könnte man den Szene-Graphen und die Übergabe-Systeme stattdessen trennen. Um diesen Typ des Verschickens zu vollbringen, können mehrere verschiedene Annäherungen genommen werden.

Auf objektorientierten Sprachen wie C ++ kann das durch virtuelle Funktionen leicht erreicht werden, wo jeder eine Operation vertritt, die auf einem Knoten durchgeführt werden kann. Virtuelle Funktionen sind einfach zu schreiben, aber es ist gewöhnlich unmöglich, neue Operationen zu Knoten ohne Zugang zum Quellcode hinzuzufügen. Wechselweise kann das Besuchermuster verwendet werden. Das hat einen ähnlichen Nachteil, in dem es ähnlich schwierig ist, neue Knotentypen hinzuzufügen.

Andere Techniken sind mit dem Gebrauch von RTTI (Laufzeittyp-Information) verbunden. Die Operation kann als eine Klasse begriffen werden, die zum aktuellen Knoten passiert wird; es fragt dann den Typ des Knotens mit RTTI und schlägt die richtige Operation in einer Reihe von Rückrufaktionen oder functors nach. Das verlangt, dass die Karte von Typen zu Rückrufaktionen oder functors an der Durchlaufzeit initialisiert wird, aber bietet mehr Flexibilität, Geschwindigkeit und Dehnbarkeit an.

Schwankungen auf diesen Techniken bestehen, und neue Methoden können hinzugefügte Vorteile anbieten. Eine Alternative ist Szene-Graph-Wiederaufbau, wo der Szene-Graph für jede der durchgeführten Operationen wieder aufgebaut wird. Das kann jedoch sehr langsam sein, aber erzeugt einen hoch optimierten Szene-Graphen. Es demonstriert, dass eine gute Szene-Graph-Durchführung schwer von der Anwendung abhängt, in der es verwendet wird.

Traversals

Traversals sind der Schlüssel zur Macht, Operationen auf Szene-Graphen anzuwenden. Ein Traversal besteht allgemein aus dem Starten an einem willkürlichen Knoten (häufig die Wurzel des Szene-Graphen), Verwendung der Operation (En) (häufig das Aktualisieren und die Übergabe von Operationen werden nacheinander angewandt), und rekursiv das Herunterlassen des Szene-Graphen (Baum) zu den Kinderknoten, bis ein Blatt-Knoten erreicht wird. An diesem Punkt überqueren viele Szene-Graph-Motoren dann unterstützen den Baum, eine ähnliche Operation anwendend. Denken Sie zum Beispiel eine machen Operation, die Transformationen in Betracht zieht: Während man unten die Szene-Graph-Hierarchie rekursiv überquert, wird eine vormachen Operation genannt. Wenn der Knoten ein Transformationsknoten ist, fügt er seine eigene Transformation zur aktuellen Transformationsmatrix hinzu. Sobald die Operation beendet, alle Kinder eines Knotens zu überqueren, ruft sie der Knoten machen Operation post, so dass der Transformationsknoten die Transformation aufmachen kann. Diese Annäherung reduziert drastisch den notwendigen Betrag der Matrixmultiplikation.

Einige Szene-Graph-Operationen sind wirklich effizienter, wenn Knoten in einer verschiedenen Ordnung überquert werden — ist das, wo einige Systeme Szene-Graph-Wiederaufbau durchführen, um den Szene-Graphen in ein zur Syntaxanalyse leichteres Format oder Baum wiederzubestellen.

Zum Beispiel, in 2. Fällen, machen Szene-Graphen normalerweise sich durch das Starten am Wurzelknoten des Baums und ziehen dann rekursiv die Kinderknoten. Die Blätter des Baums vertreten die meisten Vordergrundgegenstände. Da Zeichnung die Rückseite nach vorn mit näheren Gegenständen ausgeht, die einfach weitere überschreiben, ist der Prozess als Beschäftigung des Algorithmus des Malers bekannt. In 3D-Systemen, die häufig Tiefe-Puffer verwenden, ist es effizienter, die nächsten Gegenstände zuerst zu ziehen, da weitere Gegenstände häufig nur statt wirklich gemachten Tiefe-geprüft werden müssen, weil sie durch nähere Gegenstände verschlossen werden.

Szene-Graphen und begrenzende Volumen-Hierarchien (BVHs)

Das Springen von Volumen-Hierarchien (BVHs) ist für zahlreiche Aufgaben — einschließlich des effizienten Auswählens nützlich und Kollisionsentdeckung zwischen Gegenständen beschleunigend. Ein BVH ist eine Raumstruktur, aber muss die Geometrie nicht verteilen (sieh das Raumverteilen unten).

Ein BVH ist ein Baum von begrenzenden Volumina (häufig Bereiche, Achse-ausgerichtete begrenzende Kästen oder orientierte begrenzende Kästen). An der Unterseite von der Hierarchie ist die Größe des Volumens gerade groß genug, um einen einzelnen Gegenstand dicht (oder vielleicht sogar ein kleinerer Bruchteil eines Gegenstands in der hohen Entschlossenheit BVHs) zu umfassen. Da man die Hierarchie ersteigt, hat jeder Knoten sein eigenes Volumen, das dicht alle Volumina darunter umfasst. An der Wurzel des Baums ist ein Volumen, das alle Volumina im Baum (die ganze Szene) umfasst.

BVHs sind nützlich, um Kollisionsentdeckung zwischen Gegenständen zu beschleunigen. Wenn ein springendes Volumen eines Gegenstands kein Volumen höher im Baum durchschneidet, kann es keinen Gegenstand unter diesem Knoten durchschneiden (so werden sie alle sehr schnell zurückgewiesen).

Offensichtlich gibt es einige Ähnlichkeiten zwischen BVHs und Szene-Graphen. Ein Szene-Graph kann leicht angepasst werden, um einen BVH einzuschließen zu/werden —, wenn jeder Knoten ein Volumen vereinigen ließ oder es einen speziell angefertigten 'bestimmten Knoten gibt, der' in an der günstigen Position in der Hierarchie hinzugefügt ist. Das kann nicht die typische Ansicht von einem Szene-Graphen sein, aber es gibt Vorteile für das Umfassen eines BVH in einem Szene-Graphen.

Szene-Graphen und das Raumverteilen

Eine wirksame Weise, das Raumverteilen und die Szene-Graphen zu verbinden, ist durch das Schaffen eines Szene-Blatt-Knotens, der die Raumverteilen-Daten enthält. Das Daten sind gewöhnlich statisch und enthalten allgemein nichtbewegende Niveau-Daten in einer verteilten Form. Einige Systeme können die Systeme und ihre Übergabe getrennt haben. Das ist fein, und es gibt keine echten Vorteile für jede Methode. Insbesondere es ist schlecht, um den Szene-Graphen innerhalb des Raumverteilen-Systems enthalten zu lassen, weil vom Szene-Graphen als das großartigere System zum Raumverteilen besser gedacht wird.

Wenn es nützlich ist, sie zu verbinden

Kurzum: Das Raumverteilen/soll beträchtlich beschleunigen die Verarbeitung und Übergabe der Zeit des Szene-Graphen.

Sehr große Zeichnungen oder Szene-Graphen, die allein an der Durchlaufzeit erzeugt werden (wie es in Strahlenaufzeichnungsübergabe-Programmen geschieht), verlangen das Definieren von Gruppenknoten auf eine mehr automatisierte Mode. Ein raytracer wird zum Beispiel eine Szene-Beschreibung eines 3D-Modells nehmen und eine innere Darstellung bauen, die seine individuellen Teile in begrenzende Kästen (auch genannt begrenzende Platten) zerbricht. Diese Kästen werden hierarchisch gruppiert, so dass Strahl-Kreuzung prüft (als ein Teil des Sichtbarkeitsentschlusses), kann effizient geschätzt werden. Ein Gruppenkasten, der keinen Augenstrahl zum Beispiel durchschneidet, kann Prüfung von einigen seiner Mitglieder völlig auslassen.

Eine ähnliche Leistungsfähigkeit hält in 2. Anwendungen ebenso. Wenn der Benutzer ein Dokument vergrößert hat, so dass nur ein Teil davon auf seinem Computerschirm sichtbar ist, und dann darin scrollt, ist es nützlich, einen begrenzenden Kasten (oder in diesem Fall, ein begrenzendes Rechteck-Schema) zu verwenden, um schnell zu bestimmen, welche Szene-Graph-Elemente sichtbar sind und so wirklich gezogen werden müssen.

Abhängig von den Einzelheiten der Zeichnungsleistung der Anwendung kann ein großer Teil des Szene-Graph-Designs durch die Übergabe von Leistungsfähigkeitsrücksichten zusammengepresst werden. In 3D-Videospielen wie Beben, zum Beispiel, werden Bäume des binären Raumverteilens (BSP) schwer bevorzugt, um Sichtbarkeitstests zu minimieren. BSP Bäume nehmen jedoch sehr viel Zeit in Anspruch, um von Designszene-Graphen zu rechnen und müssen wieder gerechnet werden, wenn sich der Designszene-Graph ändert, so neigen die Niveaus dazu, statisch zu bleiben, und dynamische Charaktere im Raumverteilen-Schema nicht allgemein betrachtet werden.

Szene-Graphen für dichte regelmäßige Gegenstände wie heightfields und Vieleck-Ineinandergreifen neigen dazu, quadtrees und octrees zu verwenden, die Spezialvarianten einer begrenzenden 3D-Kasten-Hierarchie sind. Da ein heightfield ein Kasten-Volumen selbst besetzt, rekursiv diesen Kasten in acht Subkästen unterteilend (folglich der 'Okt' in octree), bis individuelle heightfield Elemente erreicht werden, ist effizient und natürlich. Ein quadtree ist einfach ein 2. octree.

Standards

PHIGS

PHIGS war die erste kommerzielle Szene-Graph-Spezifizierung, und ist ein ANSI Standard 1988 geworden. Ungleiche Durchführungen wurden von Hardware-Verkäufern von Unix zur Verfügung gestellt. Die REIFEN 3D-Grafiksystem scheinen, die erste kommerzielle von einem einzelnen Softwareverkäufer zur Verfügung gestellte Szene-Graph-Bibliothek gewesen zu sein. Es wurde entworfen, um auf der ungleichen niedrigeren Ebene 2. und 3D Schnittstellen mit der ersten größeren 1991 vollendeten Produktionsversion (v3.0) zu führen. Kurz danach hat Silikongrafik Erfinder von IRIS 1.0 (1992) befreit, der ein Szene-Graph war, der oben auf dem IRIS GL 3D-API gebaut ist. Ihm wurde mit dem Offenen Erfinder 1994, ein tragbarer oben auf OpenGL gebauter Szene-Graph gefolgt. Mehr 3D-Szene-Graph-Bibliotheken können darin gefunden werden.

X3D

X3D ist ein Dateiformat der offenen Standards ohne Königtum und Laufzeitarchitektur, um 3D-Szenen und Gegenstände mit XML zu vertreten und mitzuteilen. Es ist ein ISO-bestätigter Standard, der ein System für die Lagerung, die Wiederauffindung und das Play-Back des Echtzeitgrafikinhalts zur Verfügung stellt, der in Anwendungen, allen innerhalb einer offenen Architektur eingebettet ist, um eine breite Reihe von Gebieten und Benutzerdrehbüchern zu unterstützen.

Siehe auch

Bücher

  • Leler, Wm und Merry, Jim (1996) 3D mit REIFEN, Addison-Wesley
  • Wernecke, Josie (1994) Der Erfinder-Mentor: Objektorientierte 3D-Grafik mit dem Offenen Erfinder, Addison-Wesley, der internationalen Standardbuchnummer 0-201-62495-8 (Ausgabe 2) programmierend

Websites und Artikel

http://www.jch.com/jch/vrml/PEXTimes.txt

Tzadikim Nistarim / Das Protektorat
Impressum & Datenschutz