FireMonkey 3D

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey-Anwendungshandbuch


3D-Einführung

FireMonkey enthält 2D-Ansichten von Objekten im 3D-Raum. In einem TViewport3D wird 3D-Inhalt in einem eigentlichen 2D-Formular angezeigt, wohingegen ein TForm3D mit 3D-Inhalt beginnt. 2D und 3D können verschachtelt werden.

Für FireMonkey 3D werden die folgenden plattformspezifischen Bibliotheken verwendet:

  • Für Windows die Bibliothek Direct3D (Bestandteil von DirectX; enthalten im Unit-Gültigkeitsbereich Winapi)
  • Für den Mac die Bibliothek OpenGL (enthalten im Unit-Gültigkeitsbereich Macapi)

3D-Objekte

FireMonkey stellt mehrere Arten von 3D-Objekten bereit:

  • Grundlegende 3D-Formen wie TCube, TSphere und TCone.
  • TMesh für komplexe 3D-Objekte.
  • In 3D extrudierte 2D-Objekte, wie TText3D. Diese Objekte haben drei Seiten: Die Vorderseite mit der ursprünglichen 2D-Form, die Rückseite, ein Spiegelbild dieser Form und die Achse der Extrusion zwischen diesen beiden.
  • Flache 2D-Objekte im 3D-Raum, wie TImage3D und TTextLayer3D.

Objekte werden mit den X-, Y- und Z-Koordinaten mithilfe von TPosition3D im 3D-Raum positioniert. Zusätzlich zur Höhe (Height) und Breite (Width) verfügen diese Objekte auch über eine Tiefe (Depth). Flache 2D-Objekte im 3D-Raum sind extrem dünn mit einer fest codierten Tiefe von 0,01. 3D-Objekte verfügen über eine 3D-Drehung und Skalierung. Position, Größe, Drehung und Skalierung beziehen sich auf den Mittelpunkt des Objekts.

Wie 2D-Steuerelemente können 3D-Steuerelemente in FireMonkey jedem beliebigen anderen 3D-Steuerelement übergeordnet sein. Die Position und Drehung eines untergeordneten Objekts sind relativ zu seinem übergeordneten Objekt. Durch Bewegen oder Drehen eines übergeordneten Objekts wird die Hierarchie seiner Komponenten neu angeordnet. TLayout3D kann als sonst funktionsloses übergeordnetes Objekt zum Anordnen anderer Objekte verwendet werden.

Auf einer 2D-Oberfläche angeordnete 2D-Objekte benötigen zur Festlegung ihrer Schichtung eine Z-Reihenfolge, Objekte im 3D-Raum sind dagegen inhärent angeordnet, so dass von einem gegebenen Punkt aus betrachtet nähere Objekte weiter entferntere in derselben Sichtlinie verdecken.

Kameras

Jede Ansicht des 3D-Raums wird von einer Kamera gesteuert. Die Position und Orientierung (3D-Drehung) der Kamera legt fest, was Sie sehen. Die Designkamera ist immer vorhanden; sie wird im Formular-Designer und standardmäßig zur Laufzeit verwendet. Sie befindet sich direkt über der negativen Z-Achse (in Richtung der negativen Y-Achse), senkrecht zur X-Z-Ebene, leicht nach unten abgewinkelt, so dass sich die Position 0,0,0 in der Mitte der Ansicht befindet. Setzen Sie für eine andere Kamera die Eigenschaft UsingDesignCamera von TViewport3D oder TForm3D auf False, und weisen Sie der Eigenschaft Camera ein TCamera-Objekt zu. Eine Szene kann mehrere Kameras haben. Nach dem Zuweisen einer anderen Kamera zu der Eigenschaft Camera müssen Sie Repaint manuell aufrufen.

Der sichtbare Rauminhalt ist ein Pyramidenstumpf mit der vorderen Ebene kurz vor der Kamera. Alles zwischen der Kamera und dieser vorderen Ebene ist nicht in der Ansicht enthalten. Der Winkel des Sichtfeldes ist vertikal fest: durch Vergrößern der Höhe des Bildausschnitts/Formulars wird alles größer, durch Vergrößern der Breite wird dagegen mehr von den Seitenbereichen sichtbar. Die Einheiten für Position und Größe sind relativ zur Skalierung des Sichtfeldes.

Bildschirmprojektion

Zusätzlich zu der Ansicht eines Objekts (oder des Nichtvorhandenseins in der Ansicht), die durch die Kamera festgelgt wird, kann ein Objekt auch so eingerichtet werden, dass es unabhängig von den Kamerapunkten immer sichtbar ist, wie feste Statusindikatoren in 3D-Spielen. Dies erfolgt durch Ändern des Standardwerts Camera der Eigenschaft Projection in Screen mit folgendem Ergebnis:

  • An Position.Z null:
    • XY 0,0 ist die linke obere Ecke, genau wie in 2D. (Die 3D-Position gibt weiterhin die Position der Mitte des Objekts wieder, nicht seine linke, obere Ecke wie in 2D.)
    • Die Dimensionen Höhe (Height), Breite (Width) und Tiefe (Depth) sind – unabhängig von der Skalierung des Sichtfeldes – in Pixel angegeben.
    • Weil die Einheiten als Pixel gerendert werden, müssen die Dimensionen eines Objekts mit Bildschirmprojektion deutlich größer sein als bei der Kameraprojektion, um in derselben Größe zu erscheinen.
    • Das Objekt erscheint etwas hinter der vorderen Clipping-Ebene des Pyramidenstumpfs. Objekte, die die Kameraprojektion verwenden, haben eine schmale Lücke, in der sie vor auf dem Bildschirm projizierten Objekten erscheinen können, bevor sie durch die vordere Ebene abgeschnitten werden.
  • An Position.Z größer als null (vom Betrachter weg):
    • Die gerenderte Größe ist kleiner.
    • Durch Verkleinern der Ansicht wird das Objekt weiter in den Hintergrund verlagert, und es erscheint noch kleiner.
    • Durch Vergrößern der Ansicht wird das Objekt weiter in den Vordergrund verlagert, und es erscheint größer.
  • An Position.Z kleiner als null (zum Betrachter hin):
    • Die gerenderte Größe ist größer.
    • Durch Verkleinern der Ansicht wird das Objekt weiter in den Vordergrund verlagert, und es erscheint noch größer.
    • Durch eine zu weite Verlagerung des Objekts in den Vordergrund – entweder durch Verkleinerung der Ansicht oder direkte Angabe von Position.Z – wird das Objekt vor die vordere Ebene des Pyramidenstumpfs verlagert und verschwindet dadurch aus der Ansicht.
    • Durch Vergrößern der Ansicht wird das Objekt weiter in den Hintergrund verlagert, und es erscheint kleiner.

Durch Ändern der Projektion eines Objekts im Formular-Designer wird dessen Position neu berechnet, damit es nicht verschoben wird, sowie dessen Größe angepasst.

Kamerakran

Das vom Benutzer gesteuerte Anzeigen eines Objekts oder einer Szene aus allen Richtungen ist eine häufige 3D-Anwendung. Obwohl Sie die Position und Ausrichtung für den korrekten Kamerawinkel berechnen können, ist es einfacher, einen virtuellen Kamerakran zu erstellen:

  1. Erstellen Sie an derselben Position wie das betreffende Objekt oder in der Mitte der Szene ein unsichtbares Objekt, wie z.B. ein TDummy.
  2. Erstellen Sie ein TCamera-Objekt als untergeordnetes Element des Objekts.
    1. Setzen Sie dessen Position auf den gewünschten Abstand auf einer der Achsen.
    2. Setzen Sie bei Bedarf die Eigenschaft RotationAngle, damit die Kamera entlang der Achse zurück auf die Position zeigt. Stellen Sie sicher, dass die Kamera nicht verkehrt herum aufgestellt ist.
  3. Jetzt können Sie durch einfaches Ändern der Eigenschaft RotationAngle des Dummy-Objekts die Kamera um das Objekt drehen. Die Kamera behält den exakten Abstand bei und zeigt automatisch direkt auf die Mitte.
  4. Durch Hinzufügen von Licht als untergeordnetes Element der Kamera wird der Abstand und die Ausrichtung des Lichtes beim Bewegen der Kamera beibehalten.

Licht

Im Allgemeinen ist ein 3D-Objekt eine strukturlose schwarze Masse, außer wenn es von Licht beschienen wird. Ein oder mehrere TLight-Objekte definieren abhängig von ihrer Eigenschaft LightType Licht im 3D-Raum:

Directional
Direktionales Licht ist aus einem gegebenen Winkel konstant. Licht von der Sonne ist eine allgemeine Analogie dazu: es kommt von sehr weit her, daher werden für jeden beliebigen festgelegten Ort auf der Erde – Meter im Durchmesser, nicht Kilometer – alle Elemente gleich beleuchtet. Die Position von direktionalem Licht ist für seinen Effekt irrelevant. (Seine Position ist relevant, wenn Sie versuchen, im Formular-Designer darauf zu klicken.) Wichtig ist die Richtung, in der das Licht scheint, was von seinem RotationAngle und dem RotationAngle des übergeordneten Objekts definiert wird.
Point
Punktlicht ist mit einer nackten Glühbirne vergleichbar. Es strahlt in alle Richtungen und nimmt mit der Entfernung ab. Sein RotationAngle hat keine Auswirkung. Wichtig ist seine Position, die von der Position und Drehung seiner übergeordneten Objekte beeinflusst wird.
Spot
Scheinwerferlicht ist von der Position und Drehung abhängig und nimmt mit der Entfernung ab.

Flache 2D-Objekte im 3D-Raum benötigen weder Licht noch werden sie von Licht beeinflusst. Sie werden in der Regel mit einer hinzugefügten 3D-Perspektive angezeigt.

Materialien

Die Oberfläche eines FireMonkey-3D-Objekts wird durch sein Material definiert. FireMonkey-3D-Materialien basieren auf Schattierern. Dies ermöglicht eine unbegrenzte Variation von Licht und Materialien in einer Anwendung. Die Liste der verfügbaren Materialien befindet sich in der Tool-Palette in der Kategorie Materialien. Jedes FireMonkey-3D-Objekt verfügt über die Eigenschaft MaterialSource, die eine Materialquelle mit dem aktuellen Objekt verknüpft. Mit TMaterialBook können Sie eine Bibliothek mit Materialen erstellen und verwalten. Zur Verwendung eines Materials können Sie die Quelle mit beliebig vielen Objekten verknüpfen.

Extrudierte Objekte haben die zusätzlichen Eigenschaften MaterialShaftSource und MaterialBackSource. Diese Eigenschaften haben den Typ TMaterialSource.

Um zu steuern, wie ein Objekt unter dem Einfluss von Licht erscheint, verknüpfen Sie es mit einem TLightMaterialSource-Objekt:

  • Eine ausstrahlende (Emissive) Farbe bestimmt, ob eine Oberfläche eigenes Licht abgibt oder leuchtet. Der Standardwert ist null (keine Opazität, schwarz): Objekte leuchten normalerweise nicht und erfordern Licht, damit sie gesehen werden. Durch Setzen einer Farbe erscheinen Oberflächen ohne Licht in dieser Farbe. Wenn sie beleuchtet werden, wird die ausstrahlende Farbe mit den anderen aus dem Licht resultierenden Farben überblendet.
  • Eine umgebende (Ambient) Farbe soll eine Grundfarbe für Oberflächen bereitstellen, damit sie gesehen werden können. In der realen Welt wird Licht von vielen Richtungen auf eine Oberfläche reflektiert; aber in der 3D-Szene wäre es äußerst schwierig all dieses Licht zu definieren. Daher wird die umgebende Farbe von jedem beliebigen Licht im Raum aktiviert. (Ohne Licht hat sie keine Auswirkung.) Die Oberfläche wird völlig gleichförmig in dieser Farbe dargestellt. Mit direktionalem Licht – das nicht auf die Oberfläche gerichtet sein muss – würde alles flach aussehen. Mit Punkt- oder Scheinwerferlicht werden die Farben mit der Entfernung schwächer.
  • Eine diffuse (Diffuse) Farbe interagiert direkt mit Licht und mit dem Einfallswinkel des Lichts. Ohne Licht hat sie keine Auswirkung. In der Regel werden Ambient und Diffuse auf dieselbe Farbe gesetzt.
  • Eine reflektierende (Specular) Farbe simuliert eine glänzende Oberfläche, indem in einem bestimmten Winkel einfallendes Licht reflektiert wird, anstatt Licht in vielen Winkeln zu vermischen. Ohne Licht hat Specular keine Auswirkung. Die Vorgabe ist weiß, damit das Licht ohne Verändern seiner Farbe reflektiert werden kann.

Mischen von 2D und 3D

3D-Objekte müssen in einen 3D-Container platziert werden. Ein 3D-Objekt (wie TCube) wird nicht gerendert, wenn es direkt in einen 2D-Container (wie TForm) gesetzt wird, aber es wird in der Strukturansicht als untergeordnetes Steuerelement angezeigt. Umgekehrt werden 2D-Objekte (wie TButton) nicht gerendert, wenn sie direkt in einen 3D-Container (wie TForm3D) platziert werden, aber sie werden in der Strukturansicht als untergeordnete Steuerelemente angezeigt. Zwei Klassen ermöglichen ein verschachteltes Mischen von 2D- und 3D-Inhalt:

  • TLayer3D ist ein 3D-Objekt mit 2D-Inhalt. Es entspricht einer rechteckigen Glasscheibe im 3D-Raum.
  • TViewport3D ist ein 2D-Objekt mit 3D-Inhalt. Wie TForm3D ist es ein "Fenster" in den 3D-Raum.

Sie können diese Container verschachteln. Sie können z.B. eine Objekthierarchie wie die folgende erstellen:

  • TForm3D
    • TCube
    • TLayer3D
      • TButton
      • TViewport3D
        • TCube

Darüber hinaus gibt es einige 3D-Klassen, die 2D-Inhalt aufnehmen:

  • TTextLayer3D zeigt Text an.
  • TImage3D zeigt Bitmap-Bilder an.
  • TVideo3D zeigt Videos an.

Importieren von 3D-Modellen

Das FireMonkey-Framework unterstützt den Import von 3D-Modellen. 3D-Modelle können nur in 3D-Containern gerendert werden. Verwenden Sie zum Importieren eines 3D-Modells TModel3D-Objekte. TModel3D befindet sich in der Tool-Palette. Verwenden Sie zum Laden eines Objekts die Eigenschaft MeshCollection von TModel3D. Folgende 3D-Dateien werden unterstützt: .obj, .dae und .ase.

Die Modelle werden mit Textur importiert und angezeigt. Wenn in der Szene kein Licht vorhanden ist, ist die Textur nicht sichtbar. Grundlegende Merkmale von importierten Modellen können, wie bei jedem anderen 3D-Objekt, bearbeitet werden (drehen, verschieben, skalieren und Größe ändern).

Die korrekte Anzeige von geladenen Modellen hängt von der Beschaffenheit und Korrektur der geladenen Datei ab.

Siehe auch

Codebeispiele