Gittermodelle

Bei Gittermodellen (Meshes) handelt es sich um unveränderliche gemeinsam genutzte Ressourcen, die nur per Modellkonvertierung erstellt werden können. Gittermodelle werden zum Rendern, aber auch zum Bereitstellen einer physischen Darstellung für Raycastabfragen verwendet. Fügen Sie zum Platzieren eines Gittermodells in einem 3D-Raum einer Entität ein MeshComponent-Element hinzu.

Gittermodelltypen

Es gibt zwei verschiedene Arten von Gittermodellressourcen in ARR: Dreiecksnetze und Punktwolken. Beide Typen werden durch die gleiche API-Klasse dargestellt: Mesh. Mit Ausnahme kleiner Unterschiede im Verhalten für die unterschiedlichen Gittermodelltypen sind die zur Verfügung gestellten API-Funktionen identisch.

Der Konvertierungsdienst bestimmt den entsprechenden Gittermodelltyp automatisch durch die Quelldateierweiterung. Beispielsweise wird eine FBX-Datei immer als Dreiecksnetz konvertiert, PLY hingegen wird als Punktwolke behandelt. Eine vollständige Liste der unterstützten Dateiformate finden Sie in der Liste der Quelldateiformate.

Es gibt zwei wesentliche Unterschiede auf Benutzerseite zwischen Konvertierungen von Punktwolken und Dreiecksnetzen:

  • Punktwolkennetze machen keine Materialien verfügbar. Die visuelle Darstellung von Punkten wird ausschließlich durch ihre Punktfarbe definiert.
  • Punktwolken stellen keinen Szenegraphen zur Verfügung. Stattdessen werden alle Punkte an die Stammknotenentität angefügt.

Eigenschaften von Gittermodellressourcen

Die Eigenschaften der Mesh-Klasse lauten:

  • Materialien: Eine Reihe von Materialien. Jedes Material wird von einem anderen untergeordneten Gittermodell genutzt. Es ist möglich, dass von mehreren Einträgen im Array auf dasselbe Material verwiesen wird. Einträge in diesem Array können zur Laufzeit nicht geändert werden, die Materialeigenschaften hingegen schon. Für Punktwolken ist dieses Array leer.

  • Begrenzungen: Ein am lokalen Raum ausgerichtetes Begrenzungsfeld (AABB) der Gittervertices.

MeshComponent

Die MeshComponent-Klasse wird verwendet, um eine Instanz einer Gittermodellressource zu platzieren. Jedes „MeshComponent“-Element verweist auf ein Gittermodell. Hiermit kann überschrieben werden, welche Materialien zum Rendern der einzelnen untergeordneten Gittermodelle verwendet werden.

Eigenschaften von „MeshComponent“

  • Gitter: Die Gitterressource, die von dieser Komponente verwendet wird.

  • Materialien: Das Array von Materialien, die auf der Gitterkomponente selbst angegeben sind. Das Array hat immer die gleiche Länge wie das Array Materials (Materialien) der Gittermodellressource. Materialien, die nicht durch die Standardeinstellung des Gittermodells überschrieben werden sollen, sind in diesem Array auf null festgelegt.

  • UsedMaterials: Die Matrix der tatsächlich verwendeten Materialien für jeden Untermesh. Dies ist für Werte, die nicht „null“ sind, mit den Daten im Array Materials (Materialien) identisch. Andernfalls ist hierin der Wert aus dem Array Materials (Materialien) der Gittermodellinstanz enthalten. Dieses Array ist schreibgeschützt.

Gemeinsame Verwendung von Gittermodellen

Eine Mesh-Ressource kann von mehreren Instanzen von Gittermodellkomponenten gemeinsam verwendet werden. Darüber hinaus kann die Mesh-Ressource, die einer Gittermodellkomponente zugeordnet ist, jederzeit programmgesteuert geändert werden. Im folgenden Code wird das Klonen von Gittermodellen veranschaulicht:

Entity CloneEntityWithModel(RenderingConnection api, Entity sourceEntity)
{
    MeshComponent meshComp = sourceEntity.FindComponentOfType<MeshComponent>();
    if (meshComp != null)
    {
        Entity newEntity = api.CreateEntity();
        MeshComponent newMeshComp = api.CreateComponent(ObjectType.MeshComponent, newEntity) as MeshComponent;
        newMeshComp.Mesh = meshComp.Mesh; // share the mesh
        return newEntity;
    }
    return null;
}
ApiHandle<Entity> CloneEntityWithModel(ApiHandle<RenderingConnection> api, ApiHandle<Entity> sourceEntity)
{
    if (ApiHandle<MeshComponent> meshComp = sourceEntity->FindComponentOfType<MeshComponent>())
    {
        ApiHandle<Entity> newEntity = *api->CreateEntity();
        ApiHandle<MeshComponent> newMeshComp = api->CreateComponent(ObjectType::MeshComponent, newEntity)->as<RemoteRendering::MeshComponent>();
        newMeshComp->SetMesh(meshComp->GetMesh()); // share the mesh
        return newEntity;
    }
    return nullptr;
}

API-Dokumentation

Nächste Schritte