Aracılığıyla paylaş


Sahne anlama SDK'sı genel bakış

Sahne anlama, Karma Gerçeklik cihazınızın yakaladığı yapılandırılmamış ortam algılayıcı verilerini dönüştürür ve güçlü bir soyut gösterime dönüştürür. SDK, uygulamanızla Scene Understanding çalışma zamanı arasında iletişim katmanı görevi görür. 3B gösterimler için 3B sahne grafikleri ve 2B uygulamalar için 2B dikdörtgenler ve paneller gibi mevcut standart yapıları taklit etmeyi hedefler. Scene Understanding'in taklitleri somut çerçevelerle eşlenirken, genel olarak SceneUnderstanding ile etkileşim kuran çeşitli çerçeveler arasında birlikte çalışabilirlik sağlayan çerçeve belirsizdir. Scene Understanding geliştikçe SDK'nın rolü, yeni gösterimlerin ve özelliklerin birleşik bir çerçevede kullanıma sunulmaya devam etmesini sağlamaktır. Bu belgede öncelikle geliştirme ortamı/kullanımı hakkında bilgi edinmenize yardımcı olacak üst düzey kavramları tanıtacak ve ardından belirli sınıflar ve yapılar için daha ayrıntılı belgeler sağlayacağız.

SDK'yi nereden edinebilirim?

SceneUnderstanding SDK'sı Karma Gerçeklik Özellik Aracı aracılığıyla indirilebilir.

Not: En son sürüm önizleme paketlerine bağlıdır ve bunu görmek için yayın öncesi paketleri etkinleştirmeniz gerekir.

Sürüm 0.5.2022-rc ve üzeri için, Scene Understanding C# ve C++ için dil projeksiyonlarını destekler ve uygulamaların Win32 veya UWP platformları için uygulama geliştirmesine olanak tanır. Bu sürümden itibaren SceneUnderstanding, yalnızca HoloLens2 ile iletişim kurmak için kullanılan SceneObserver'ı engelleyen düzenleyici içi unity desteğini destekler.

SceneUnderstanding için Windows SDK sürüm 18362 veya üzeri gerekir.

Kavramsal Genel Bakış

Sahne

Karma gerçeklik cihazınız, ortamınızda gördükleriyle ilgili bilgileri sürekli olarak tümleştirir. Scene Understanding bu veri kaynaklarının tümünü huniler ve tek bir uyumlu soyutlama üretir. Scene Understanding, tek bir şeyin örneğini (örneğin, bir duvar/tavan/zemin) temsil eden SceneObjects'in bir bileşimi olan Sahneler oluşturur. Sahne Nesneleri, bu SceneObject'i oluşturan daha ayrıntılı parçaları temsil eden [SceneComponents" öğesinin bir bileşimidir. Bileşenlere örnek olarak dörtlüler ve tireler verilebilir, ancak gelecekte sınırlayıcı kutular, çakışma çizgileri, meta veriler vb. gösterilecektir.

Ham algılayıcı verilerini bir Görünüme dönüştürme işlemi, orta alanlarda (~10x10m) büyük alanlar (~50x50m) için saniyeler ile dakikalar arasında sürebilecek, pahalı olabilecek bir işlemdir ve bu nedenle uygulama isteği olmadan cihaz tarafından hesaplanan bir işlem değildir. Bunun yerine, sahne oluşturma uygulamanız tarafından isteğe bağlı olarak tetikleniyor. SceneObserver sınıfı, bir sahneyi hesaplayabilen veya seri durumdan çıkarabilen statik yöntemlere sahiptir ve bu yöntemlerle numaralandırabilir/etkileşim kurabilirsiniz. "İşlem" eylemi isteğe bağlı olarak yürütülür ve CPU üzerinde ancak ayrı bir işlemde (Karma Gerçeklik Sürücüsü) yürütülür. Bununla birlikte, başka bir işlemde işlem yaparken, elde edilen Sahne verileri, Scene nesnesinde uygulamanızda depolanır ve korunur.

Aşağıda bu işlem akışını gösteren ve Scene Understanding çalışma zamanıyla kesişen iki uygulamanın örneklerini gösteren bir diyagram verilmiştir.

İşlem Diyagramı

Sol tarafta, her zaman açık olan ve kendi sürecinde çalışan karma gerçeklik çalışma zamanının diyagramı yer alır. Bu çalışma zamanı, Scene Understanding'in çevrenizdeki dünyayı anlamak ve anlamak için kullandığı cihaz izleme, uzamsal eşleme ve diğer işlemleri gerçekleştirmekle sorumludur. Diyagramın sağ tarafında, Scene Understanding'i kullanan iki teorik uygulama gösterilir. İlk uygulama, Scene Understanding SDK'sını dahili olarak kullanan MRTK ile arabirimler, ikinci uygulama ise iki ayrı sahne örneği hesaplar ve kullanır. Bu diyagramdaki üç Sahne de sahnelerin farklı örneklerini oluşturur; sürücü uygulamalar arasında paylaşılan genel durumu izlemez ve bir sahnedeki Sahne Nesneleri başka bir görünümde bulunmaz. Scene Understanding zaman içinde izlemek için bir mekanizma sağlar, ancak bu SDK kullanılarak yapılır. İzleme kodu, uygulamanızın sürecinde SDK'da zaten çalışıyor.

Her Sahne, verilerini uygulamanızın bellek alanında depoladığından, Scene nesnesinin veya iç verilerinin tüm işlevlerinin uygulamanızın işleminde her zaman yürütüldüğünü varsayabilirsiniz.

Layout

Scene Understanding ile çalışmak için çalışma zamanının bileşenleri mantıksal ve fiziksel olarak nasıl temsil ettiği bilmek ve anlamak değerli olabilir. Sahne, önemli düzeltmelere gerek kalmadan gelecekteki gereksinimleri karşılamak için kullanılabilecek temel bir yapıyı korurken basit olarak seçilmiş belirli bir düzene sahip verileri temsil eder. Sahne bunu tüm Bileşenleri (tüm Sahne Nesneleri için yapı taşları) düz bir listede depolayarak ve belirli bileşenlerin diğerlerine başvurduğu başvurular aracılığıyla hiyerarşi ve oluşturma tanımlayarak yapar.

Aşağıda hem düz hem de mantıksal biçimde bir yapı örneği sunuyoruz.

Mantıksal DüzenFiziksel Düzen
    Sahne
    • SceneObject_1
      • SceneMesh_1
      • SceneQuad_1
      • SceneQuad_2
    • SceneObject_2
      • SceneQuad_1
      • SceneQuad_3
    • SceneObject_3
      • SceneMesh_3
  • SceneObject_1
  • SceneObject_2
  • SceneObject_3
  • SceneQuad_1
  • SceneQuad_2
  • SceneQuad_3
  • SceneMesh_1
  • SceneMesh_2

Bu çizim, Sahne'nin fiziksel ve mantıksal düzeni arasındaki farkı vurgular. Sol tarafta, uygulamanızın sahneyi numaralandırırken gördüğü verilerin hiyerarşik düzenini görüyoruz. Sağ tarafta, sahnenin gerekirse tek tek erişilebilen 12 ayrı bileşenden meydana geldiğini görüyoruz. Yeni bir sahneyi işlerken uygulamaların bu hiyerarşide mantıksal olarak yürümesini bekleriz, ancak sahne güncelleştirmeleri arasında izleme yaparken bazı uygulamalar yalnızca iki sahne arasında paylaşılan belirli bileşenleri hedeflemekle ilgilenebilir.

API’ye genel bakış

Aşağıdaki bölümde, Scene Understanding'deki yapılara üst düzey bir genel bakış sağlanır. Bu bölümü okumak, sahnelerin nasıl temsil edileceğini ve çeşitli bileşenlerin ne için kullanıldığını anlamanızı sağlar. Sonraki bölümde, bu genel bakışta ayrıntılı olarak ele alınan somut kod örnekleri ve ek ayrıntılar sağlanacaktır.

Aşağıda açıklanan türlerin tümü ad alanında Microsoft.MixedReality.SceneUnderstanding bulunur.

SceneComponents

Artık sahnelerin mantıksal düzenini anladığınıza göre, SceneComponents kavramını ve hiyerarşi oluşturmak için nasıl kullanıldıklarını sunabiliriz. SceneComponents, SceneUnderstanding'in tek bir çekirdek şeyi temsil eden en ayrıntılı ayrıştırmalardır, örneğin bir örgü, dörtlü veya sınırlayıcı kutu. SceneComponents bağımsız olarak güncelleştirilebilen ve diğer SceneComponent'ler tarafından başvurulabilen öğelerdir, bu nedenle bu tür izleme/başvuru mekanizmasına olanak sağlayan tek bir genel özelliğe, benzersiz bir kimliğe sahiptirler. Kimlikler, sahne hiyerarşisinin mantıksal bileşimi ve nesne kalıcılığı (bir sahneyi diğerine göre güncelleştirme eylemi) için kullanılır.

Yeni hesaplanan her sahneyi ayrı olarak değerlendiriyor ve yalnızca içindeki tüm verileri numaralandırıyorsanız, kimlikler sizin için büyük ölçüde saydamdır. Ancak, bileşenleri birkaç güncelleştirme üzerinden izlemeyi planlıyorsanız, Sahne nesneleri arasında SceneComponents dizinini oluşturmak ve bulmak için kimlikleri kullanırsınız.

SceneObjects

SceneObject, bir "şeyin" örneğini temsil eden bir SahneBileşenidir; örneğin, duvar, zemin, tavan vb... Kind özelliği tarafından ifade edilir. SceneObjects geometriktir ve bu nedenle boşluktaki konumlarını temsil eden işlevlere ve özelliklere sahiptir, ancak geometrik veya mantıksal yapı içermezler. Bunun yerine, SceneObjects, sistem tarafından desteklenen çeşitli gösterimleri sağlayan diğer SceneComponent'lere, özellikle SceneQuads'a ve SceneMeshes'e başvurur. Yeni bir sahne hesaplandığında, uygulamanız büyük olasılıkla ilgilendiğini işlemek için Sahnenin SceneObjects'ini numaralandırır.

SceneObjects aşağıdakilerden herhangi birine sahip olabilir:

SceneObjectKind Description
Arka PlanSceneObject'in diğer tanınan sahne nesne türlerinden biri olmadığı bilinmektedir. Bu sınıf, Arka Plan'ın duvar/zemin/tavan vb. olmadığı bilinen Bilinmeyen ile karıştırılmamalıdır.... ancak henüz kategorilere ayrılmadı.
DuvarFiziksel bir duvar. Duvarların taşınamaz çevre yapıları olduğu varsayılır.
FloorZeminler, üzerinde yürüyebilen herhangi bir yüzeydir. Not: Merdivenler zemin değildir. Ayrıca, zeminlerin herhangi bir yürünebilir yüzey varsaydığını ve bu nedenle tek bir zeminin açık bir varsayımı olmadığını unutmayın. Çok düzeyli yapılar, rampalar vb... tümü zemin olarak sınıflandırılmalıdır.
CeilingBir odanın üst yüzeyi.
PlatformHologramları yerleştirebileceğiniz geniş bir düz yüzey. Bunlar tabloları, tezgahları ve diğer büyük yatay yüzeyleri temsil eder.
DünyaEtiketlemeden bağımsız geometrik veriler için ayrılmış etiket. EnableWorldMesh güncelleştirme bayrağı ayarlanarak oluşturulan ağ dünya olarak sınıflandırılabilir.
BilinmiyorBu sahne nesnesi henüz sınıflandırılmadı ve bir tür atandı. Bu, Arka Plan ile karıştırılmamalıdır, çünkü bu nesne herhangi bir şey olabileceğinden, sistem henüz bunun için yeterince güçlü bir sınıflandırma oluşturmamıştır.

SceneMesh

SceneMesh, üçgen listesi kullanarak rastgele geometrik nesnelerin geometrisini yaklaşık olarak gösteren bir SceneComponent'tır. SceneMeshes birkaç farklı bağlamda kullanılır; bunlar, su geçirmez hücre yapısının bileşenlerini veya Sahne ile ilişkili sınırsız uzamsal haritalama ağında temsil eden WorldMesh olarak temsil edebilir. Her ağ ile sağlanan dizin ve köşe verileri, tüm modern işleme API'lerinde üçgen çizgileri işlemek için kullanılan köşe ve dizin arabellekleriyle aynı tanıdık düzeni kullanır. Sahne Anlama'da, tireler 32 bit dizinler kullanır ve belirli işleme altyapıları için öbeklere bölünmesi gerekebilir.

Sargı Sırası ve Koordinat Sistemleri

Scene Understanding tarafından üretilen tüm tirelerin, saat yönünde sargı sırasını kullanarak Right-Handed koordinat sisteminde tire döndürmesi beklenir.

Not: .191105 öncesi işletim sistemi derlemelerinde "Dünya" tirelerinin daha sonra düzeltilen Counter-Clockwise sargı sırasına göre döndürdüğü bilinen bir hata olabilir.

SceneQuad

SceneQuad, 3B dünyayı kaplayan 2b yüzeyleri temsil eden bir SceneComponent'tır. SceneQuads, ARKit ARPlaneAnchor veya ARCore Düzlemleri'ne benzer şekilde kullanılabilir, ancak düz uygulamalar tarafından kullanılacak 2b tuvaller veya genişletilmiş UX olarak daha üst düzey işlevler sunar. Yerleştirmeyi ve düzenin kullanımını basit hale getiren dörtlüler için 2B'ye özgü API'ler sağlanır ve dörtlülerle geliştirme (işleme dışında) 3b çizgiler yerine 2b tuvallerle çalışmaya benzer olmalıdır.

SceneQuad şekli

SceneQuads, sınırlanmış dikdörtgen bir yüzeyi 2b olarak tanımlar. Ancak SceneQuads, rastgele ve karmaşık olabilecek şekillere (örneğin halka şeklindeki tablo) sahip yüzeyleri temsil eder. Dörtlünün yüzeyinin karmaşık şeklini temsil etmek için GetSurfaceMask API'sini kullanarak yüzeyin şeklini sağladığınız bir görüntü arabelleği üzerinde işleyebilirsiniz. Dörtlüye sahip SceneObject'te de bir mesh varsa, örgü üçgenleri bu işlenmiş görüntüye eşdeğer olmalıdır, her ikisi de yüzeyin gerçek geometrisini 2b veya 3b koordinatlarda temsil eder.

SDK ayrıntılarını ve başvurularını anlama sahnesi

Not

MRTK kullanırken MRTK'nin ['WindowsSceneUnderstandingObserver'](xref:Microsoft.MixedReality.Toolkit.WindowsSceneUnderstanding.Experimental.WindowsSce ile etkileşimde bulunabileceğinizi lütfen unutmayınneUnderstandingObserver?view=mixed-reality-toolkit-unity-2020-dotnet-2.8.0&preserve-view=true) ve bu nedenle çoğu durumda bu bölümü atlayabilir. Daha fazla bilgi için lütfen [MRTK Scene Understanding docs](/windows/mixed-reality/mrtk-unity/features/spatial-awareness/scene-understanding) bölümüne bakın.

Aşağıdaki bölüm, SceneUnderstanding'in temellerini öğrenmenize yardımcı olacaktır. Bu bölüm size temel bilgileri sağlamalıdır ve bu noktada SceneUnderstanding'in bütünsel olarak nasıl kullanıldığını görmek için örnek uygulamalara göz atmak için yeterli bağlama sahip olmanız gerekir.

Başlatma

SceneUnderstanding ile çalışmanın ilk adımı, uygulamanızın bir Scene nesnesine başvuru kazanmasıdır. Bu işlem iki yoldan biriyle yapılabilir; bir Sahne sürücü tarafından hesaplanabilir veya geçmişte hesaplanan mevcut bir Sahne seri durumdan çıkarılabilir. İkincisi, uygulamaların ve deneyimlerin karma gerçeklik cihazı olmadan hızlı bir şekilde prototipinin oluşturulabildiği Geliştirme sırasında SceneUnderstanding ile çalışmak için kullanışlıdır.

Sahneler bir SceneObserver kullanılarak hesaplanır. Bir Sahne oluşturmadan önce uygulamanızın, SceneUnderstanding'i desteklediğini ve SceneUnderstanding'in ihtiyaç duyduğu bilgiler için kullanıcı erişimi istemesini sağlamak için cihazınızı sorgulaması gerekir.

if (!SceneObserver.IsSupported())
{
    // Handle the error
}

// This call should grant the access we need.
await SceneObserver.RequestAccessAsync();

RequestAccessAsync() çağrılmazsa, yeni bir Sahneyi hesaplama başarısız olur. Ardından, Karma Gerçeklik mikrofonlu kulaklığın kökünü oluşturan ve 10 metrelik yarıçapı olan yeni bir sahneyi hesaplayacağız.

// Create Query settings for the scene update
SceneQuerySettings querySettings;

querySettings.EnableSceneObjectQuads = true;                                       // Requests that the scene updates quads.
querySettings.EnableSceneObjectMeshes = true;                                      // Requests that the scene updates watertight mesh data.
querySettings.EnableOnlyObservedSceneObjects = false;                              // Do not explicitly turn off quad inference.
querySettings.EnableWorldMesh = true;                                              // Requests a static version of the spatial mapping mesh.
querySettings.RequestedMeshLevelOfDetail = SceneMeshLevelOfDetail.Fine;            // Requests the finest LOD of the static spatial mapping mesh.

// Initialize a new Scene
Scene myScene = SceneObserver.ComputeAsync(querySettings, 10.0f).GetAwaiter().GetResult();

Verilerden Başlatma (bilgisayar yolu olarak da bilinir)

Sahneler doğrudan tüketim için hesaplanabilirken, daha sonra kullanmak üzere serileştirilmiş biçimde de hesaplanabilir. Geliştiricilerin bir cihaza ihtiyaç duymadan Scene Understanding'de çalışmasını ve test etmesini sağladığından bu, geliştirme için yararlı olduğu kanıtlanmıştır. Bir sahneyi seri hale getirme eylemi, sahneyi hesaplama işlemiyle neredeyse aynıdır, veriler SDK tarafından yerel olarak seri durumdan çıkarılmak yerine uygulamanıza döndürülür. Daha sonra kendiniz seri durumdan çıkarabilirsiniz veya gelecekte kullanmak üzere kaydedebilirsiniz.

// Create Query settings for the scene update
SceneQuerySettings querySettings;

// Compute a scene but serialized as a byte array
SceneBuffer newSceneBuffer = SceneObserver.ComputeSerializedAsync(querySettings, 10.0f).GetAwaiter().GetResult();

// If we want to use it immediately we can de-serialize the scene ourselves
byte[] newSceneData = new byte[newSceneBuffer.Size];
newSceneBuffer.GetData(newSceneData);
Scene mySceneDeSerialized = Scene.Deserialize(newSceneData);

// Save newSceneData for later

SceneObject Numaralandırması

Artık uygulamanızın bir sahnesi olduğuna göre, uygulamanız SceneObjects'e bakıyor ve bunlarla etkileşimde bulunuyor olacak. Bu, SceneObjects özelliğine erişilerek yapılır:

SceneObject firstFloor = null;

// Find the first floor object
foreach (var sceneObject in myScene.SceneObjects)
{
    if (sceneObject.Kind == SceneObjectKind.Floor)
    {
        firstFloor = sceneObject;
        break;
    }
}

Bileşen güncelleştirme ve yeniden bağlama bileşenleri

Sahne'de FindComponent adlı bileşenleri alan başka bir işlev daha vardır. Bu işlev, izleme nesnelerini güncelleştirirken ve sonraki sahnelerde bulurken kullanışlıdır. Aşağıdaki kod, önceki bir sahneyle ilgili yeni bir sahneyi hesaplar ve ardından yeni sahnede zemini bulur.

// Compute a new scene, and tell the system that we want to compute relative to the previous scene
Scene myNextScene = SceneObserver.ComputeAsync(querySettings, 10.0f, myScene).GetAwaiter().GetResult();

// Use the Id for the floor we found last time, and find it again
firstFloor = (SceneObject)myNextScene.FindComponent(firstFloor.Id);

if (firstFloor != null)
{
    // We found it again, we can now update the transforms of all objects we attached to this floor transform
}

Sahne Nesnelerinden Kesik Çizgilere ve Dörtlülere Erişme

SceneObjects bulunduktan sonra uygulamanız büyük olasılıkla, oluşturduğu dörtlü/tirelerde bulunan verilere erişmek isteyecektir. Bu verilere Quads ve Meshes özellikleriyle erişilir. Aşağıdaki kod, floor nesnemizin tüm dörtlülerini ve kısa çizgilerini numaralandırır.


// Get the transform for the SceneObject
System.Numerics.Matrix4x4 objectToSceneOrigin = firstFloor.GetLocationAsMatrix();

// Enumerate quads
foreach (var quad in firstFloor.Quads)
{
    // Process quads
}

// Enumerate meshes
foreach (var mesh in firstFloor.Meshes)
{
    // Process meshes
}

Dönüşümün Scene origin'e göre olan SceneObject olduğuna dikkat edin. Bunun nedeni SceneObject'in bir "şeyin" örneğini temsil etme ve boşlukta locatable olması, dörtlülerin ve tirelerin üst öğeye göre dönüştürülmüş geometriyi temsil etmelerindendir. Ayrı SceneObject'lerin aynı SceneMesh/SceneQuad SceneComponents'e başvurması ve bir SceneObject'in birden fazla SceneMesh/SceneQuad olması da mümkündür.

Dönüşümlerle ilgilenme

Scene Understanding, dönüşümlerle ilgilenirken geleneksel 3B sahne gösterimleriyle uyumlu hale getirmek için kasıtlı bir girişimde bulundu. Bu nedenle her sahne, en yaygın 3B çevre temsilleri gibi tek bir koordinat sistemiyle sınırlandırılır. SceneObjects'in her birinin konumları bu koordinat sistemine göre sağlanır. Uygulamanız tek bir kaynağın sağladığı değerin sınırını uzatan Sahnelerle ilgileniyorsa, SceneObjects'i SpatialAnchors'a sabitleyebilir veya birkaç sahne oluşturup bunları birleştirebilir, ancak kolaylık olması için, sahnelerin sahne.OriginSpatialGraphNodeId tarafından tanımlanan bir NodeId ile yerelleştirilmiş kendi kaynaklarında mevcut olduğunu varsayalım.

Örneğin aşağıdaki Unity kodu, koordinat sistemlerini birbirine hizalamak için Windows Algısı ve Unity API'lerinin nasıl kullanılacağını gösterir. Unity'nin dünya kökenine karşılık gelen SpatialCoordinateSystem elde etme hakkında ayrıntılı bilgi için Bkz. SpatialCoordinateSystemKarma Gerçeklik ve SpatialGraphInteropPreview.

private System.Numerics.Matrix4x4? GetSceneToUnityTransformAsMatrix4x4(SceneUnderstanding.Scene scene)
{
    System.Numerics.Matrix4x4? sceneToUnityTransform = System.Numerics.Matrix4x4.Identity;

    
    Windows.Perception.Spatial.SpatialCoordinateSystem sceneCoordinateSystem = Microsoft.Windows.Perception.Spatial.Preview.SpatialGraphInteropPreview.CreateCoordinateSystemForNode(scene.OriginSpatialGraphNodeId);
    Windows.Perception.Spatial.SpatialCoordinateSystem unityCoordinateSystem = Microsoft.Windows.Perception.Spatial.SpatialCoordinateSystem.FromNativePtr(UnityEngine.XR.WindowsMR.WindowsMREnvironment.OriginSpatialCoordinateSystem);

    sceneToUnityTransform = sceneCoordinateSystem.TryGetTransformTo(unityCoordinateSystem);

    if (sceneToUnityTransform != null)
    {
        sceneToUnityTransform = ConvertRightHandedMatrix4x4ToLeftHanded(sceneToUnityTransform.Value);
    }
    else
    {
        return null;
    }
            
    return sceneToUnityTransform;
}

Her SceneObject birinin bir dönüşümü vardır ve bu dönüşüm bu nesneye uygulanır. Unity'de sağ el koordinatlarına dönüştürüyor ve yerel dönüşümleri şu şekilde atıyoruz:

private System.Numerics.Matrix4x4 ConvertRightHandedMatrix4x4ToLeftHanded(System.Numerics.Matrix4x4 matrix)
{
    matrix.M13 = -matrix.M13;
    matrix.M23 = -matrix.M23;
    matrix.M43 = -matrix.M43;

    matrix.M31 = -matrix.M31;
    matrix.M32 = -matrix.M32;
    matrix.M34 = -matrix.M34;

    return matrix;
}

 private void SetUnityTransformFromMatrix4x4(Transform targetTransform, System.Numerics.Matrix4x4 matrix, bool updateLocalTransformOnly = false)
 {
    if(targetTransform == null)
    {
        return;
    }

    Vector3 unityTranslation;
    Quaternion unityQuat;
    Vector3 unityScale;

    System.Numerics.Vector3 vector3;
    System.Numerics.Quaternion quaternion;
    System.Numerics.Vector3 scale;

    System.Numerics.Matrix4x4.Decompose(matrix, out scale, out quaternion, out vector3);

    unityTranslation = new Vector3(vector3.X, vector3.Y, vector3.Z);
    unityQuat        = new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
    unityScale       = new Vector3(scale.X, scale.Y, scale.Z);

    if(updateLocalTransformOnly)
    {
        targetTransform.localPosition = unityTranslation;
        targetTransform.localRotation = unityQuat;
    }
    else
    {
        targetTransform.SetPositionAndRotation(unityTranslation, unityQuat);
    }
}

// Assume we have an SU object called suObject and a unity equivalent unityObject

System.Numerics.Matrix4x4 converted4x4LocationMatrix = ConvertRightHandedMatrix4x4ToLeftHanded(suObject.GetLocationAsMatrix());
SetUnityTransformFromMatrix4x4(unityObject.transform, converted4x4LocationMatrix, true);
        

Dört

Dörtlüler, 2B yerleştirme senaryolarına yardımcı olmak için tasarlanmıştır ve 2B tuval UX öğelerinin uzantıları olarak düşünülmelidir. Dörtlüler SceneObjects'in bileşenleri olsa da ve 3B olarak işlenebilirken, Dörtlü API'ler dörtlülerin 2B yapılar olduğunu varsayar. Kapsam, şekil ve yerleştirme için API'ler gibi bilgiler sunar.

Dörtlülerin dikdörtgen boyutları vardır, ancak rastgele şekillendirilmiş 2B yüzeyleri temsil eder. 3B ortam dörtlüleriyle etkileşim kuran bu 2B yüzeylerde yerleştirmeyi etkinleştirmek için bu etkileşimi mümkün hale getirmek için yardımcı programlar sunar. Şu anda Scene Understanding, FindCentermostPlacement ve GetSurfaceMask gibi iki işlev sağlar. FindCentermostPlacement, dörtlüde bir nesnenin yerleştirilebileceği konumu bulan ve sağladığınız sınırlayıcı kutunun temel alınan yüzeyde kalmasını garanti eden nesneniz için en iyi konumu bulmaya çalışan üst düzey bir API'dir.

Not

Çıkışın koordinatları, diğer windows Rect türlerinde olduğu gibi sol üst köşesi (x = 0, y = 0) olan "dörtlü boşluk" içindeki dörtlüye göredir. Kendi nesnelerinizin kaynaklarıyla çalışırken bunu dikkate aldığınızdan emin olun.

Aşağıdaki örnekte, en ortadaki yerleştirilebilir konumu bulma ve hologramı dörtlüye bağlama gösterilmektedir.

// This code assumes you already have a "Root" object that attaches the Scene's Origin.

// Find the first quad
foreach (var sceneObject in myScene.SceneObjects)
{
    // Find a wall
    if (sceneObject.Kind == SceneObjectKind.Wall)
    {
        // Get the quad
        var quads = sceneObject.Quads;
        if (quads.Count > 0)
        {
            // Find a good location for a 1mx1m object  
            System.Numerics.Vector2 location;
            if (quads[0].FindCentermostPlacement(new System.Numerics.Vector2(1.0f, 1.0f), out location))
            {
                // We found one, anchor something to the transform
                // Step 1: Create a new game object for the quad itself as a child of the scene root
                // Step 2: Set the local transform from quads[0].Position and quads[0].Orientation
                // Step 3: Create your hologram and set it as a child of the quad's game object
                // Step 4: Set the hologram's local transform to a translation (location.x, location.y, 0)
            }
        }
    }
}

1-4 arası adımlar, özel çerçevenize/uygulamanıza büyük ölçüde bağlıdır, ancak temalar benzer olmalıdır. Dörtlü'ün uzayda yerelleştirilmiş sınırlanmış bir 2B düzlemi temsil ettiğini unutmayın. Altyapınızın/çerçevenizin dörtlü nerede olduğunu bilmesini sağlayarak ve nesnelerinizi dörtlüye göre köklendirerek hologramlarınız gerçek dünyaya göre doğru bir şekilde konumlandırılır.

Örgü

Tireler, nesnelerin veya ortamların geometrik temsillerini temsil eder. Uzamsal eşleme gibi, her uzamsal yüzey ağıyla sağlanan mesh dizini ve köşe verileri de tüm modern işleme API'lerinde üçgen çizgileri işlemek için kullanılan köşe ve dizin arabellekleriyle aynı tanıdık düzeni kullanır. Köşe konumları, koordinat sisteminde Scenesağlanır. Bu verilere başvurmak için kullanılan belirli API'ler aşağıdaki gibidir:

void GetTriangleIndices(int[] indices);
void GetVertices(System.Numerics.Vector3[] vertices);

Aşağıdaki kod, örgü yapısından üçgen listesi oluşturma örneği sağlar:

uint[] indices = new uint[mesh.TriangleIndexCount];
System.Numerics.Vector3[] positions = new System.Numerics.Vector3[mesh.VertexCount];

mesh.GetTriangleIndices(indices);
mesh.GetVertexPositions(positions);

Dizin/köşe arabellekleri = dizin/köşe sayısı olmalıdır >, ancak aksi takdirde belleğin verimli bir şekilde yeniden kullanılmasına izin veren rastgele boyutlandırılabilir.

ColliderMesh

Sahne nesneleri, Mesh ve ColliderMeshes özellikleri aracılığıyla mesh ve collider mesh verilerine erişim sağlar. Bu tireler her zaman eşleşir, yani Meshes özelliğinin i'nci dizini ColliderMeshes özelliğinin i'inci diziniyle aynı geometriyi temsil eder. Çalışma zamanı/nesnesi harmanlama kısa çizgilerini destekliyorsa, en düşük çokgen, en yüksek sıralı yaklaşık değeri almanız garanti edilir ve uygulamanızın harmanlayıcıları kullanacağı her yerde ColliderMeshes kullanmak iyi bir uygulamadır. Sistem harmanlamaları desteklemiyorsa ColliderMeshes içinde döndürülen Mesh nesnesi, bellek kısıtlamalarını azaltan ağ ile aynı nesne olacaktır.

Sahne anlama ile geliştirme

Bu noktada, sahnenin çalışma zamanını ve SDK'yı anlama temel yapı taşları anlamanız gerekir. Güç ve karmaşıklığın büyük bir kısmı erişim desenleri, 3B çerçevelerle etkileşim ve uzamsal planlama, oda analizi, gezinti, fizik gibi daha gelişmiş görevleri gerçekleştirmek için bu API'lerin üzerine yazılabilir araçlardır. Bunları, senaryolarınızı daha parlak hale getirmek için uygun yönde yönlendirecek örneklerde yakalamayı umuyoruz. Ele almadığımız örnekler veya senaryolar varsa bize bildirin; ihtiyacınız olan şeyleri belgeleyelim/prototip oluşturun.

Örnek kodu nereden alabilirim?

Unity için Scene Understanding örnek kodu , Unity Örnek Sayfası sayfamızda bulunabilir. Bu uygulama, cihazınızla iletişim kurmanızı ve çeşitli sahne nesnelerini işlemenizi sağlar veya bilgisayarınıza serileştirilmiş bir sahne yüklemenize ve bir cihaz olmadan Scene Understanding deneyimi yaşamanıza olanak sağlar.

Örnek sahneleri nereden alabilirim?

HoloLens2'niz varsa, ComputeSerializedAsync çıktısını dosyaya kaydederek ve istediğiniz zaman seri durumdan çıkararak yakaladığınız herhangi bir sahneyi kaydedebilirsiniz.

HoloLens2 cihazınız yoksa ancak Scene Understanding ile oynamak istiyorsanız, önceden yakalanan bir sahneyi indirmeniz gerekir. Scene Understanding örneği şu anda size uygun şekilde indirilebilen ve kullanılabilen serileştirilmiş sahnelerle birlikte sevk edilir. Bunları burada bulabilirsiniz:

Sahne Anlama Örnek Sahneler

Ayrıca bkz.