Laufzeit-Texturaustausch#

Wie man einen Actor neu texturierbar macht#

Um texturtauschbar zu sein, muss ein Actor von der Elternklasse TextureShuffleActor erben. Die Elternklasse kann über den Einstellungs-Tab im Blueprint des Actors gesetzt werden.

Parent Class

Nachdem die Elternklasse auf TextureShuffActor gesetzt wurde, erhält das Objekt das Mitglied DynamicMaterial. DynamicMaterial muss auf allen Instanzen des Actors in der Szene auf TextureSwappableMaterial gesetzt werden. Warnung: Das statische Setzen des Dynamic Material im Blueprint kann zu Renderingfehlern führen. Es scheint besser zu funktionieren, es auf allen Instanzen des Actors in der Szene über das Detailfenster zu setzen.

TextureSwappableMaterial

Wie man die Menge(n) der Texturen definiert, aus denen gewählt werden kann#

Typischerweise teilen sich bestimmte Teilmengen von Actors eine Menge von Texturoptionen miteinander. (z.B. Wände, die Teil desselben Gebäudes sind)

Es ist einfach, diese Gruppierungen mithilfe der Gruppierungsbearbeitungsfunktionalität von Unreal Engine einzurichten. Wählen Sie alle Instanzen aus, die dieselbe Texturauswahl haben sollen, und fügen Sie die Texturen allen gleichzeitig über das Detailfenster hinzu. Verwenden Sie dieselbe Technik, um Gruppen von Actors deskriptive Tags hinzuzufügen, die in der API zur Adressierung verwendet werden.

Group Editing

Es ist ideal, von größeren zu kleineren Gruppierungen zu arbeiten, einfach indem man Actors abwählt, um die Gruppierung im Laufe der Zeit zu verfeinern, und zuletzt einzelne Actor-Eigenschaften anwendet.

Subset Editing

Wie man Texturen über die API austauscht#

Die folgende API ist in C++ und Python verfügbar. (C++ gezeigt)

std::vector<std::string> simSwapTextures(const std::string& tags, int tex_id);

Die Zeichenkette aus durch Kommata oder ", " getrennten Tags identifiziert, auf welchen Actors der Austausch stattfinden soll. Die tex_id indiziert das Array von Texturen, die jedem Actor zugewiesen sind, der einen Austausch durchläuft. Die Funktion gibt die Liste der Objekte zurück, die den bereitgestellten Tags entsprochen haben und bei denen der Texturaustausch durchgeführt wurde. Wenn tex_id für den Textursatz eines Objekts außerhalb des gültigen Bereichs liegt, wird er modulo der Anzahl der verfügbaren Texturen genommen.

Demo (Python)

import airsim
import time

c = airsim.client.MultirotorClient()
print(c.simSwapTextures("furniture", 0))
time.sleep(2)
print(c.simSwapTextures("chair", 1))
time.sleep(2)
print(c.simSwapTextures("table", 1))
time.sleep(2)
print(c.simSwapTextures("chair, right", 0))

Ergebnisse

['RetexturableChair', 'RetexturableChair2', 'RetexturableTable']
['RetexturableChair', 'RetexturableChair2']
['RetexturableTable']
['RetexturableChair2']

Demo

Beachten Sie, dass in diesem Beispiel für denselben Indexwert unterschiedliche Texturen für jeden Actor ausgewählt wurden.

Sie können auch die APIs simSetObjectMaterial und simSetObjectMaterialFromTexture verwenden, um das Material eines Objekts auf ein beliebiges Material-Asset oder einen Dateipfad einer Textur zu setzen. Weitere Informationen zur Verwendung dieser APIs finden Sie unter Texture APIs.