Megosztás a következőn keresztül:


Entitások

Az entitás egy mozgatható objektumot jelöl a térben, és a távolról renderelt tartalom alapvető építőeleme.

Entitás tulajdonságai

Az entitások egy pozíció, forgatás és skálázás által meghatározott átalakítással rendelkeznek. Az entitások önmagukban nem rendelkeznek megfigyelhető funkciókkal. Ehelyett a rendszer az entitásokhoz csatolt összetevőkön keresztül ad hozzá viselkedést. Egy CutPlaneComponent csatolása például létrehoz egy vágássíkot az entitás helyén.

Magának az entitásnak a legfontosabb eleme a hierarchia és az eredményül kapott hierarchikus átalakítás. Ha például több entitás gyermekként csatlakozik egy megosztott szülőentitáshoz, az összes ilyen entitás egyszerre mozgatható, elforgatható és skálázható a szülő entitás átalakításának módosításával. Az entitás állapota emellett a hierarchiában lévő teljes algráf láthatóságának enabled és a sugár leadott adatokra adott válaszok kikapcsolására is használható.

Az entitás egyedileg a szülő tulajdonában van, ami azt jelenti, hogy amikor a szülő megsemmisül Entity.Destroy(), akkor a gyermekei és az összes csatlakoztatott összetevő is. Így a modell eltávolítása a jelenetből egy modell gyökércsomópontjának meghívásával Destroy történik, amelyet RenderingSession.Connection.LoadModelAsync() a rendszer vagy annak SAS-variánsa RenderingSession.Connection.LoadModelFromSasAsync()ad vissza.

Az entitások akkor jönnek létre, amikor a kiszolgáló betölti a tartalmat, vagy amikor a felhasználó objektumot szeretne hozzáadni a jelenethez. Ha például egy felhasználó hozzá szeretne adni egy kivágott síkot a háló belsejének megjelenítéséhez, a felhasználó létrehozhat egy entitást, ahol a síknak léteznie kell, majd hozzáadhatja a vágósík összetevőjét.

Entitás létrehozása

Ha új entitást szeretne hozzáadni a jelenethez, például a modellek betöltéséhez vagy az összetevők csatolásához, használja az alábbi kódot:

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;
}

Query functions

Az entitásokon kétféle lekérdezési függvény létezik: szinkron és aszinkron hívások. A szinkron lekérdezések csak az ügyfélen található adatokhoz használhatók, és nem igényelnek sok számítást. Ilyenek például az összetevők, a relatív objektumátalakítások vagy a szülő-gyermek kapcsolatok lekérdezése. Az aszinkron lekérdezések olyan adatokhoz használatosak, amelyek csak a kiszolgálón találhatók, vagy olyan extra számításokat igényelnek, amelyek túl költségesek lennének az ügyfélen való futtatáshoz. Ilyenek például a térbeli kötött lekérdezések vagy a metaadat-lekérdezések.

Összetevők lekérdezése

Egy adott típusú összetevő megkereséséhez használja a következőt 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>();

Átalakítások lekérdezése

Az átalakító lekérdezések szinkron hívások az objektumon. Fontos megjegyezni, hogy az API-oldalon tárolt átalakítások helyi térátalakítások az objektum szülőfelületéhez képest. Kivételt képeznek a gyökérobjektumok, amelyek esetében a helyi tér és a világtér azonos.

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

Ha az összes faátalakítási összetevőt (pozíció, forgatás és méretezés) egyszerre kell lekérni vagy beállítani, javasoljuk, hogy használja az entitás tulajdonságát LocalTransform :

// local space transform of the entity
Transform localTransform = entity.LocalTransform;
Double3 translation = localTransform.Position;
Quaternion rotation = localTransform.Rotation;
Float3 scale = localTransform.Scale;
// local space transform of the entity
Transform localTransform = entity->GetLocalTransform();
Double3& translation = localTransform.Position;
Quaternion& rotation = localTransform.Rotation;
Float3& scale = localTransform.Scale;

Van egy segédfüggvény is az entitás globális (világűrbeli) átalakításának lekéréséhez:

// global space transform of the entity
Transform globalTransform = entity.GlobalTransform;
Double3 translation = globalTransform.Position;
// global space transform of the entity
Transform globalTransform = entity->GetGlobalTransform();
Double3& translation = globalTransform.Position;

Amikor GlobalTransform meghívják, a globális átalakítás menet közben lesz kiszámítva az entitáshierarchia bejárásával. Ez a bejárás jelentős számítást igényel, de az ügyféloldali műveletek osztályon Entitykeresztüli végrehajtásához képest a beépített függvény gyorsabb. A nagyobb entitások meghívása GlobalTransform azonban teljesítménybeli szűk keresztmetszetet eredményezhet.

LocalToGlobalMatrixGlobalTransform a globális átalakítást mátrixként számítja ki, amely a Unity kontextusában kényelmes:

UnityEngine.Matrix4x4 globalMatrix = entity.LocalToGlobalMatrix.toUnity();
UnityEngine.Vector3 localPos = new UnityEngine.Vector3(0, 0, 0);
UnityEngine.Vector3 globalPos = globalMatrix.MultiplyPoint(localPos);

Térbeli határok lekérdezése

A kötött lekérdezések olyan aszinkron hívások, amelyek teljes objektumhierarchián működnek, és egy entitást használnak gyökérként. Tekintse meg a dedikált fejezetet az objektumhatárokról.

Metaadatok lekérdezése

A metaadatok olyan objektumokon tárolt további adatok, amelyeket a kiszolgáló figyelmen kívül hagy. Az objektum metaadatai lényegében párok (név, érték) halmaza, ahol az érték numerikus, logikai vagy sztring típusú lehet. A metaadatok exportálhatók a modellel.

A metaadat-lekérdezések egy adott entitás aszinkron hívásai. A lekérdezés csak egyetlen entitás metaadatait adja vissza, nem pedig az algráf egyesített adatait.

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();

        // ...
    }
});

A lekérdezés akkor is sikeres, ha az objektum nem rendelkezik metaadatokkal.

API-dokumentáció

Következő lépések