Entiteter

En entitet representerar ett rörligt objekt i utrymme och är det grundläggande Bygg stenarna för fjärrrenderat innehåll.

Egenskaper för entitet

Entiteter har en transformering som definieras av en position, rotation och skala. Själva entiteten har inte någon funktion som kan ha någon funktion. I stället läggs beteendet till i-komponenter som är kopplade till entiteter. Om du till exempel bifogar ett CutPlaneComponent skapas ett klipp plan i entitetens position.

Den viktigaste aspekten av själva entiteten är hierarkin och den resulterande hierarkiska omvandlingen. Till exempel när flera entiteter är kopplade som underordnade till en delad överordnad entitet, kan alla dessa entiteter flyttas, roteras och skalas i dem samtidigt genom att ändra den överordnade entitetens omvandling. Entitetens enabled tillstånd kan också användas för att stänga av synlighet och svar på Ray-sändningar för ett fullständigt under diagram i hierarkin.

En entitet ägs unikt av dess överordnade, vilket innebär att när det överordnade objektet förstörs, Entity.Destroy() så är dess underordnade och alla anslutna komponenter. Därför utförs borttagning av en modell från scenen genom att anropar Destroy rotnoden i en modell, som returneras av RenderingSession.Connection.LoadModelAsync() eller dess SAS-variant RenderingSession.Connection.LoadModelFromSasAsync() .

Entiteter skapas när servern läser in innehåll eller när användaren vill lägga till ett objekt i scenen. Om en användare till exempel vill lägga till ett klipp plan för att visualisera insidan av ett nät, kan användaren skapa en entitet där planet ska finnas och sedan lägga till komponenten klipp ut plan till den.

Skapa en entitet

Om du vill lägga till en ny entitet i scenen, till exempel för att skicka den som ett rot objekt för inläsning av modeller eller koppla komponenter till den, använder du följande kod:

Entity CreateNewEntity(RenderingSession session)
{
    Entity entity = session.Connection.CreateEntity();
    entity.Position = new LocalPosition(1, 2, 3);
    return entity;
}
ApiHandle<Entity> CreateNewEntity(ApiHandle<RenderingSession> session)
{
    ApiHandle<Entity> entity(nullptr);
    if (auto entityRes = session->Connection()->CreateEntity())
    {
        entity = entityRes.value();
        entity->SetPosition(Double3{ 1, 2, 3 });
        return entity;
    }
    return entity;
}

Fråge funktioner

Det finns två typer av fråge funktioner på entiteter: synkrona och asynkrona anrop. Synkrona frågor kan bara användas för data som finns på klienten och inte omfattar mycket beräkning. Exempel frågar efter komponenter, relativa objekt transformationer eller överordnade/underordnade relationer. Asynkrona frågor används för data som bara finns på servern eller som inbegriper extra beräkning som skulle vara dyra att köra på klienten. Exempel är spatiala gränserfrågor eller frågor om meta-data.

Fråga komponenter

Om du vill hitta en komponent av en speciell typ använder du FindComponentOfType :

CutPlaneComponent cutplane = (CutPlaneComponent)entity.FindComponentOfType(ObjectType.CutPlaneComponent);

// or alternatively:
CutPlaneComponent cutplane = entity.FindComponentOfType<CutPlaneComponent>();
ApiHandle<CutPlaneComponent> cutplane = entity->FindComponentOfType(ObjectType::CutPlaneComponent)->as<CutPlaneComponent>();

// or alternatively:
ApiHandle<CutPlaneComponent> cutplane = entity->FindComponentOfType<CutPlaneComponent>();

Fråga transformeringar

Transformations frågor är synkrona anrop i objektet. Det är viktigt att Observera att transformeringar som frågas genom API: et är lokala lagrings utrymmen, i förhållande till objektets överordnade objekt. Undantag är rot objekt, där det lokala utrymmet och det internationella utrymmet är identiska.

Anteckning

Det finns inget dedikerat API för att fråga hela objektets transformering av utrymmet.

// local space transform of the entity
Double3 translation = entity.Position;
Quaternion rotation = entity.Rotation;
// local space transform of the entity
Double3 translation = entity->GetPosition();
Quaternion rotation = entity->GetRotation();

Frågar efter rums gränser

Bindnings frågor är asynkrona anrop som används i en fullständig objektorienterad hierarki, med en entitet som en rot. Se det dedikerade kapitlet om objekt gränser.

Frågar metadata

Metadata är ytterligare data lagrade på objekt som ignoreras av servern. Metadata för objekt är i grunden en uppsättning (namn, värde) par, där värdet kan vara av typen numerisk, boolesk eller sträng. Metadata kan exporteras med modellen.

Metadata-frågor är asynkrona anrop i en speciell entitet. Frågan returnerar bara metadata för en enskild entitet, inte den sammanslagna informationen för ett under diagram.

Task<ObjectMetadata> metaDataQuery = entity.QueryMetadataAsync();
ObjectMetadata metaData = await metaDataQuery;
ObjectMetadataEntry entry = metaData.GetMetadataByName("MyInt64Value");
System.Int64 intValue = entry.AsInt64;
// ...
entity->QueryMetadataAsync([](Status status, ApiHandle<ObjectMetadata> metaData) 
{
    if (status == Status::OK)
    {
        ApiHandle<ObjectMetadataEntry> entry = *metaData->GetMetadataByName("MyInt64Value");
        int64_t intValue = *entry->GetAsInt64();

        // ...
    }
});

Frågan kommer att lyckas även om objektet inte innehåller några metadata.

API-dokumentation

Nästa steg