Aracılığıyla paylaş


Varlıklar

Varlık, uzayda taşınabilir bir nesneyi temsil eder ve uzaktan işlenen içeriğin temel yapı taşıdır.

Varlık özellikleri

Varlıkların konum, döndürme ve ölçekle tanımlanan bir dönüşümü vardır. Varlıkların tek başına gözlemlenebilir işlevleri yoktur. Bunun yerine davranış, varlıklara eklenen bileşenler aracılığıyla eklenir. Örneğin, CutPlaneComponent eklemek varlığın konumunda bir kesme düzlemi oluşturur.

Varlığın en önemli yönü hiyerarşi ve sonuçta elde edilen hiyerarşik dönüşümdür. Örneğin, paylaşılan bir üst varlığa alt öğe olarak birden çok varlık eklendiğinde, üst varlığın dönüşümü değiştirilerek bu varlıkların tümü birlikte taşınabilir, döndürülebilir ve ölçeklendirilebilir. Ayrıca varlığın durumu, hiyerarşideki enabled tam bir alt grafik için işın atamalarına yönelik görünürlüğü ve yanıtları kapatmak için kullanılabilir.

Bir varlık benzersiz olarak üst öğeye aittir, yani üst öğe ile Entity.Destroy()yok edildiğinde alt öğeleri ve tüm bağlı bileşenleri de olur. Bu nedenle, bir modelin sahneden kaldırılması, veya SAS değişkeni RenderingSession.Connection.LoadModelFromSasAsync()tarafından RenderingSession.Connection.LoadModelAsync() döndürülen bir modelin kök düğümünde çağrılarak Destroy gerçekleştirilir.

Varlıklar, sunucu içerik yüklediğinde veya kullanıcı sahnesine bir nesne eklemek istediğinde oluşturulur. Örneğin, bir kullanıcı bir ağın içini görselleştirmek için kesme düzlemi eklemek isterse, düzlemin mevcut olması gereken bir varlık oluşturabilir ve ardından kesme düzlemi bileşenini buna ekleyebilir.

Varlık oluşturma

Görünüme yeni bir varlık eklemek, örneğin modelleri yüklemek veya bileşenleri eklemek için kök nesne olarak geçirmek için aşağıdaki kodu kullanın:

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

Sorgu işlevleri

Varlıklarda iki tür sorgu işlevi vardır: zaman uyumlu ve zaman uyumsuz çağrılar. Zaman uyumlu sorgular yalnızca istemcide bulunan ve çok fazla hesaplama içermeyen veriler için kullanılabilir. Bileşenler, göreli nesne dönüştürmeleri veya üst/alt ilişkileri sorgulama örnekleri verilebilir. Zaman uyumsuz sorgular, yalnızca sunucuda bulunan veya istemcide çalıştırılamayacak kadar pahalı olacak fazladan hesaplamalar içeren veriler için kullanılır. Uzamsal sınırlar sorguları veya meta veri sorguları örnek olarak verilebilir.

Bileşenleri sorgulama

Belirli bir türün bileşenini bulmak için kullanın 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>();

Dönüşümleri sorgulama

Dönüştürme sorguları nesnedeki zaman uyumlu çağrılardır. API tarafında depolanan dönüşümlerin nesnenin üst öğesine göre yerel alan dönüşümleri olduğunu unutmayın. Özel durumlar, yerel alan ve dünya alanının aynı olduğu kök nesnelerdir.

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

Tüm ağaç dönüştürme bileşenlerinin (konum, döndürme ve ölçek) aynı anda alınması veya ayarlanması gerekiyorsa varlığın LocalTransform özelliğinin kullanılması önerilir:

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

Ayrıca bir varlığın genel (dünya alanı) dönüşümünü almak için bir yardımcı işlev de vardır:

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

Çağrıldığında GlobalTransform , genel dönüşüm, varlık hiyerarşisi üzerinden geçilerek anında hesaplanır. Bu dolaşma önemli hesaplamalar içerir, ancak aynı işlemleri istemci tarafında sınıfı Entityüzerinden yapmaya kıyasla yerleşik işlev daha hızlıdır. Yine de, daha büyük bir varlık kümesinde çağrılması GlobalTransform bir performans sorununa neden olabilir.

LocalToGlobalMatrix , Unity bağlamında uygun olan genel dönüşümü matris olarak hesaplayan bir değişkendir GlobalTransform :

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

Uzamsal sınırları sorgulama

Sınır sorguları, bir varlığı kök olarak kullanarak tam nesne hiyerarşisinde çalışan zaman uyumsuz çağrılardır. Nesne sınırları hakkında ayrılmış bölüme bakın.

Meta verileri sorgulama

Meta veriler, sunucu tarafından yoksayılan nesnelerde depolanan ek verilerdir. Nesne meta verileri temelde değerin sayısal, boole veya dize türünde olabileceği bir dizi (ad, değer) çiftidir. Meta veriler modelle dışarı aktarılabilir.

Meta veri sorguları, belirli bir varlıkta zaman uyumsuz çağrılardır. Sorgu, alt grafiğin birleştirilmiş bilgilerini değil yalnızca tek bir varlığın meta verilerini döndürür.

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

        // ...
    }
});

Nesne hiçbir meta veri barındırmasa bile sorgu başarılı olur.

API belgeleri

Sonraki adımlar