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 Entity
keresztü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.
LocalToGlobalMatrix
GlobalTransform
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ó
- C# entitásosztály
- C# renderelés Csatlakozás ion. CreateEntity()
- C++ entitásosztály
- C++ renderelés Csatlakozás ion::CreateEntity()