Bagikan melalui


Gambaran umum SDK pemahaman adegan

Pemahaman adegan mengubah data sensor lingkungan yang tidak terstruktur yang ditangkap perangkat Mixed Reality Anda dan mengubahnya menjadi representasi abstrak yang kuat. SDK bertindak sebagai lapisan komunikasi antara aplikasi Anda dan runtime Pemahaman Adegan. Ini bertujuan untuk meniru konstruksi standar yang ada, seperti grafik adegan 3D untuk representasi 3D, serta persegi panjang dan panel 2D untuk aplikasi 2D. Sementara mimik Scene Understanding konstruksi akan memetakan ke kerangka kerja konkret, secara umum SceneUnderstanding adalah agnostik kerangka kerja yang memungkinkan interoperabilitas antara berbagai kerangka kerja yang berinteraksi dengannya. Seiring berkembangnya Scene Understanding, peran SDK adalah memastikan representasi dan kemampuan baru terus diekspos dalam kerangka kerja terpadu. Dalam dokumen ini, pertama-tama kami akan memperkenalkan konsep tingkat tinggi yang akan membantu Anda membiasakan diri dengan lingkungan/penggunaan pengembangan dan kemudian memberikan dokumentasi yang lebih rinci untuk kelas dan konstruksi tertentu.

Di mana saya bisa mendapatkan SDK?

SDK SceneUnderstanding dapat diunduh melalui Mixed Reality Feature Tool.

Catatan: rilis terbaru bergantung pada paket pratinjau dan Anda harus mengaktifkan paket pra-rilis untuk melihatnya.

Untuk versi 0.5.2022-rc dan yang lebih baru, Scene Understanding mendukung proyeksi bahasa untuk C# dan C++ yang memungkinkan aplikasi mengembangkan aplikasi untuk platform Win32 atau UWP. Pada versi ini, SceneUnderstanding mendukung dukungan unity in-editor yang menghambat SceneObserver, yang hanya digunakan untuk berkomunikasi dengan HoloLens2.

SceneUnderstanding memerlukan Windows SDK versi 18362 atau lebih tinggi.

Gambaran Umum Konseptual

Adegan

Perangkat realitas campuran Anda terus mengintegrasikan informasi tentang apa yang dilihatnya di lingkungan Anda. Scene Understanding menyalurkan semua sumber data ini dan menghasilkan satu abstraksi kohesif tunggal. Pemahaman Adegan menghasilkan Adegan, yang merupakan komposisi SceneObjects yang mewakili instans dari satu hal, (misalnya, dinding/langit-langit/lantai.) Objek Adegan sendiri adalah komposisi [SceneComponents, yang mewakili potongan yang lebih terperinci yang membentuk SceneObject ini. Contoh komponen adalah quad dan jala, tetapi di masa depan dapat mewakili kotak pembatas, jala tabrakan, metadata, dll.

Proses mengonversi data sensor mentah menjadi Adegan adalah operasi yang berpotensi mahal yang dapat memakan waktu beberapa detik untuk ruang sedang (~10x10m) menjadi menit untuk ruang besar (~50x50m) dan oleh karena itu itu bukan sesuatu yang sedang dihitung oleh perangkat tanpa permintaan aplikasi. Sebaliknya, Pembuatan adegan dipicu oleh aplikasi Anda sesuai permintaan. Kelas SceneObserver memiliki metode statis yang dapat Menghitung atau Mendeserialisasi adegan, yang kemudian dapat Anda hitung/berinteraksi. Tindakan "Komputasi" dijalankan sesuai permintaan dan dijalankan pada CPU tetapi dalam proses terpisah (driver Mixed Reality). Namun, sementara kami melakukan komputasi dalam proses lain, data Adegan yang dihasilkan disimpan dan dikelola dalam aplikasi Anda di objek Adegan.

Di bawah ini adalah diagram yang menggambarkan alur proses ini dan menunjukkan contoh dua aplikasi yang berinteraksi dengan runtime Pemahaman Adegan.

Diagram Proses

Di sisi kiri adalah diagram runtime realitas campuran, yang selalu aktif dan berjalan dalam prosesnya sendiri. Runtime ini bertanggung jawab untuk melakukan pelacakan perangkat, pemetaan spasial, dan operasi lain yang digunakan Scene Understanding untuk memahami dan alasan tentang dunia di sekitar Anda. Di sisi kanan diagram, kami menunjukkan dua aplikasi teoritis yang memanfaatkan Pemahaman Adegan. Antarmuka aplikasi pertama dengan MRTK, yang menggunakan SDK Scene Understanding secara internal, aplikasi kedua menghitung dan menggunakan dua instans adegan terpisah. Ketiga Adegan dalam diagram ini menghasilkan instans adegan yang berbeda, driver tidak melacak status global yang dibagikan antara aplikasi dan Objek Adegan dalam satu adegan tidak ditemukan di adegan lain. Pemahaman Adegan memang menyediakan mekanisme untuk melacak dari waktu ke waktu, tetapi ini dilakukan menggunakan SDK. Kode pelacakan sudah berjalan di SDK dalam proses aplikasi Anda.

Karena setiap Adegan menyimpan datanya di ruang memori aplikasi, Anda dapat berasumsi bahwa semua fungsi objek Scene atau data internalnya selalu dijalankan dalam proses aplikasi Anda.

Layout

Untuk bekerja dengan Scene Understanding, mungkin berharga untuk mengetahui dan memahami bagaimana runtime mewakili komponen secara logis dan fisik. Adegan mewakili data dengan tata letak tertentu yang dipilih agar sederhana sambil mempertahankan struktur dasar yang dapat diandalkan untuk memenuhi persyaratan di masa mendatang tanpa memerlukan revisi utama. Adegan melakukan ini dengan menyimpan semua Komponen (blok penyusun untuk semua Objek Adegan) dalam daftar datar dan menentukan hierarki dan komposisi melalui referensi di mana komponen tertentu mereferensikan yang lain.

Di bawah ini kami menyajikan contoh struktur dalam bentuk datar dan logis.

Tata Letak LogikaTata Letak Fisik
    Tempat peristiwa
    • 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

Ilustrasi ini menyoroti perbedaan antara tata letak fisik dan logis Adegan. Di sebelah kiri, kita melihat tata letak hierarkis data yang dilihat aplikasi Anda saat menghitung adegan. Di sebelah kanan, kita melihat bahwa adegan terdiri dari 12 komponen berbeda yang dapat diakses secara individual jika perlu. Saat memproses adegan baru, kami mengharapkan aplikasi berjalan secara logis hierarki ini, namun ketika melacak antara pembaruan adegan, beberapa aplikasi mungkin hanya tertarik untuk menargetkan komponen tertentu yang dibagikan di antara dua adegan.

Ringkasan API

Bagian berikut ini memberikan gambaran umum tingkat tinggi tentang konstruksi dalam Pemahaman Adegan. Membaca bagian ini akan memberi Anda pemahaman tentang bagaimana adegan diwakili, dan untuk apa berbagai komponen dilakukan/digunakan. Bagian berikutnya akan memberikan contoh kode konkret dan detail tambahan yang dilapisi dalam gambaran umum ini.

Semua jenis yang dijelaskan di bawah ini berada di Microsoft.MixedReality.SceneUnderstanding namespace layanan.

SceneComponents

Sekarang setelah Anda memahami tata letak adegan yang logis, kita dapat menyajikan konsep SceneComponents dan bagaimana adegan tersebut digunakan untuk menyusun hierarki. SceneComponents adalah dekomposisi paling terperinci dalam SceneUnderstanding yang mewakili satu hal inti, misalnya, jala atau quad atau kotak pembatas. SceneComponents adalah hal-hal yang dapat diperbarui secara independen dan dapat dirujuk oleh SceneComponent lainnya, karenanya mereka memiliki satu properti global, ID unik, yang memungkinkan jenis mekanisme pelacakan/referensi ini. ID digunakan untuk komposisi logis hierarki adegan serta persistensi objek (tindakan memperbarui satu adegan relatif terhadap adegan lainnya).

Jika Anda memperlakukan setiap adegan yang baru dihitung sebagai berbeda, dan hanya menghitung semua data di dalamnya, maka ID sebagian besar transparan bagi Anda. Namun, jika Anda berencana untuk melacak komponen selama beberapa pembaruan, Anda akan menggunakan ID untuk mengindeks dan menemukan SceneComponents di antara objek Scene.

SceneObjects

SceneObject adalah SceneComponent yang mewakili instans "hal" misalnya, dinding, lantai, langit-langit, dll.... dinyatakan oleh properti Jenis mereka. SceneObjects bersifat geometris, dan karenanya memiliki fungsi dan properti yang mewakili lokasinya di ruang, namun tidak berisi struktur geometris atau logis apa pun. Sebaliknya, SceneObjects mereferensikan SceneComponent lainnya, khususnya SceneQuads, dan SceneMeshes, yang menyediakan berbagai representasi yang didukung oleh sistem. Ketika adegan baru dihitung, aplikasi Anda kemungkinan besar akan menghitung SceneObjects Adegan untuk memproses apa yang diminatinya.

SceneObjects dapat memiliki salah satu hal berikut:

SceneObjectKind Deskripsi
Latar belakangSceneObject diketahui bukan salah satu jenis objek adegan lain yang dikenali. Kelas ini tidak boleh dikacaukan dengan Tidak Diketahui di mana Latar Belakang diketahui tidak dinding / lantai / langit-langit dll.... sementara belum diketahui belum dikategorikan.
DindingDinding fisik. Dinding diasumsikan sebagai struktur lingkungan yang tidak bergerak.
floorLantai adalah permukaan apa pun di mana seseorang dapat berjalan. Catatan: tangga bukan lantai. Perhatikan juga, bahwa lantai mengasumsikan permukaan yang dapat dilalui dan oleh karena itu tidak ada asumsi eksplisit dari lantai tunggal. Struktur multi-tingkat, landai dll.... semua harus diklasifikasikan sebagai lantai.
ceilingPermukaan atas ruangan.
PlatformPermukaan datar besar tempat Anda dapat menempatkan hologram. Ini cenderung mewakili tabel, countertop, dan permukaan horizontal besar lainnya.
DuniaLabel khusus untuk data geometrik yang agnostik untuk pelabelan. Jala yang dihasilkan dengan mengatur bendera pembaruan EnableWorldMesh akan diklasifikasikan sebagai dunia.
Tidak dikenalObjek adegan ini belum diklasifikasikan dan diberi jenis. Ini seharusnya tidak dikacaukan dengan Latar Belakang, karena objek ini bisa apa saja, sistem belum muncul dengan klasifikasi yang cukup kuat untuk itu.

SceneMesh

SceneMesh adalah SceneComponent yang memperkirakan geometri objek geometri arbitrer menggunakan daftar segitiga. SceneMeshes digunakan dalam beberapa konteks yang berbeda; mereka dapat mewakili komponen struktur sel kedap air atau sebagai WorldMesh, yang mewakili jala pemetaan spasial yang tidak terbatas yang terkait dengan Adegan. Data indeks dan puncak yang disediakan dengan setiap jala menggunakan tata letak yang sama dengan puncak dan buffer indeks yang digunakan untuk merender jala segitiga di semua API penyajian modern. Dalam Scene Understanding, jala menggunakan indeks 32-bit dan mungkin perlu dipecah menjadi potongan untuk mesin penyajian tertentu.

Sistem Urutan dan Koordinat Berliku

Semua jala yang dihasilkan oleh Scene Understanding diharapkan mengembalikan jala dalam sistem koordinat Right-Handed menggunakan urutan berliku searah jala.

Catatan: Build OS sebelum .191105 mungkin memiliki bug yang diketahui di mana jala "Dunia" kembali dalam urutan berliku Counter-Clockwise, yang kemudian telah diperbaiki.

SceneQuad

SceneQuad adalah SceneComponent yang mewakili permukaan 2d yang menempati dunia 3D. SceneQuads dapat digunakan mirip dengan ARKit ARPlaneAnchor atau ARCore Planes tetapi mereka menawarkan fungsionalitas tingkat yang lebih tinggi sebagai kanvas 2d untuk digunakan oleh aplikasi datar, atau api khusus UX. 2D tambahan disediakan untuk quad yang membuat penempatan dan tata letak mudah digunakan, dan mengembangkan (dengan pengecualian penyajian) dengan quad harus terasa lebih mirip dengan bekerja dengan kanvas 2d daripada jala 3d.

Bentuk SceneQuad

SceneQuads mendefinisikan permukaan persegi panjang terikat dalam 2d. Namun, SceneQuads mewakili permukaan dengan bentuk arbitrer dan berpotensi kompleks (misalnya tabel berbentuk donat.) Untuk mewakili bentuk kompleks permukaan quad, Anda dapat menggunakan GETSurfaceMask API untuk merender bentuk permukaan ke buffer gambar yang Anda sediakan. Jika SceneObject yang memiliki quad juga memiliki jala, segitiga jala harus setara dengan gambar yang dirender ini, keduanya mewakili geometri nyata permukaan, baik dalam koordinat 2d atau 3d.

Adegan memahami detail dan referensi SDK

Catatan

Saat menggunakan MRTK, harap dicatat bahwa Anda akan berinteraksi dengan MRTK ['WindowsSceneUnderstandingObserver'](xref:Microsoft.MixedReality.Toolkit.WindowsSceneUnderstanding.Experimental.WindowsSceneUnderstandingObserver?view=mixed-reality-toolkit-unity-2020-dotnet-2.8.0&preserve-view=true) dan dengan demikian dapat melewati bagian ini dalam sebagian besar keadaan. Silakan merujuk ke [dokumen PEMAHAMAN Adegan MRTK](/windows/mixed-reality/mrtk-unity/features/spatial-awareness/scene-understanding) untuk informasi lebih lanjut.

Bagian berikut akan membantu Anda terbiasa dengan dasar-dasar SceneUnderstanding. Bagian ini harus memberi Anda dasar-dasar, di mana Anda harus memiliki konteks yang cukup untuk menelusuri aplikasi sampel untuk melihat bagaimana SceneUnderstanding digunakan secara holistik.

Inisialisasi

Langkah pertama untuk bekerja dengan SceneUnderstanding adalah agar aplikasi Anda mendapatkan referensi ke objek Scene. Ini dapat dilakukan dengan salah satu dari dua cara, Adegan dapat dihitung oleh driver, atau Adegan yang ada yang dihitung di masa lalu dapat diserialisasikan. Yang terakhir berguna untuk bekerja dengan SceneUnderstanding selama pengembangan, di mana aplikasi dan pengalaman dapat diprototi dengan cepat tanpa perangkat realitas campuran.

Adegan dihitung menggunakan SceneObserver. Sebelum membuat Adegan, aplikasi Anda harus meminta perangkat Anda untuk memastikan bahwa itu mendukung SceneUnderstanding, serta untuk meminta akses pengguna untuk informasi yang dibutuhkan SceneUnderstanding.

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

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

Jika RequestAccessAsync() tidak dipanggil, komputasi Adegan baru akan gagal. Selanjutnya kita akan menghitung adegan baru yang berakar di sekitar headset Mixed Reality dan memiliki radius 10 meter.

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

Inisialisasi dari Data (juga dikenal sebagai. Jalur PC)

Meskipun Adegan dapat dihitung untuk konsumsi langsung, adegan tersebut juga dapat dihitung dalam bentuk serial untuk digunakan nanti. Ini telah terbukti berguna untuk pengembangan karena memungkinkan pengembang untuk bekerja dan menguji Pemahaman Adegan tanpa perlu perangkat. Tindakan serialisasi adegan hampir identik dengan komputasinya, data dikembalikan ke aplikasi Anda alih-alih dideserialisasi secara lokal oleh SDK. Anda kemudian dapat mendeserialisasinya sendiri atau menyimpannya untuk digunakan di masa mendatang.

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

Enumerasi SceneObject

Sekarang setelah aplikasi Anda memiliki adegan, aplikasi Anda akan melihat dan berinteraksi dengan SceneObjects. Ini dilakukan dengan mengakses properti SceneObjects :

SceneObject firstFloor = null;

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

Komponen pembaruan dan penyempurnaan komponen

Ada fungsi lain yang mengambil komponen di Adegan yang disebut FindComponent. Fungsi ini berguna saat memperbarui objek pelacakan dan menemukannya di adegan selanjutnya. Kode berikut akan menghitung adegan baru yang relatif terhadap adegan sebelumnya dan kemudian menemukan lantai di adegan baru.

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

Mengakses Jala dan Quad dari Objek Adegan

Setelah SceneObjects ditemukan, aplikasi Anda kemungkinan besar akan ingin mengakses data yang terkandung dalam quad/mesh yang terdiri darinya. Data ini diakses dengan properti Quads dan Meshes . Kode berikut akan menghitung semua quad dan jala objek lantai kami.


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

Perhatikan bahwa itu adalah SceneObject yang memiliki transformasi yang relatif terhadap asal Adegan. Ini karena SceneObject mewakili instans "hal" dan dapat di-locatable di ruang, quad, dan jala mewakili geometri yang diubah relatif terhadap induknya. SceneObjects terpisah dapat mereferensikan SceneMesh/SceneQuad SceneComponents yang sama, dan ada kemungkinan juga bahwa SceneObject memiliki lebih dari satu SceneMesh/SceneQuad.

Menangani Transformasi

Pemahaman Adegan telah melakukan upaya yang disengaja untuk menyelaraskan dengan representasi adegan 3D tradisional saat berhadapan dengan transformasi. Oleh karena itu, setiap Adegan terbatas pada satu sistem koordinat seperti representasi lingkungan 3D yang paling umum. SceneObjects masing-masing menyediakan lokasinya relatif terhadap sistem koordinat tersebut. Jika aplikasi Anda berurusan dengan Adegan yang membentangkan batas apa yang disediakan oleh satu asal dapat menjangkar SceneObjects ke SpatialAnchors, atau menghasilkan beberapa adegan dan menggabungkannya bersama-sama, tetapi untuk kesederhanaan kami berasumsi bahwa adegan kedap air ada di asalnya sendiri yang dilokalkan oleh satu NodeId yang ditentukan oleh Scene.OriginSpatialGraphNodeId.

Kode Unity berikut, misalnya, menunjukkan cara menggunakan Windows Perception dan Unity API untuk menyelaraskan sistem koordinat bersama-sama. Lihat SpatialCoordinateSystem dan SpatialGraphInteropPreview untuk detail tentang API Windows Perception, dan Mixed Reality objek asli di Unity untuk detail tentang mendapatkan SpatialCoordinateSystem yang sesuai dengan asal dunia Unity.

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

Masing-masing SceneObject memiliki transformasi, yang kemudian diterapkan ke objek tersebut. Di Unity, kami mengonversi ke koordinat tangan kanan dan menetapkan transformasi lokal sebagai berikut:

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

Quad

Quad dirancang untuk membantu skenario penempatan 2D dan harus dianggap sebagai ekstensi untuk elemen UX kanvas 2D. Meskipun Quads adalah komponen SceneObjects dan dapat dirender dalam 3D, API Quad sendiri mengasumsikan Quads adalah struktur 2D. Mereka menawarkan informasi seperti jangkauan, bentuk, dan menyediakan API untuk penempatan.

Quad memiliki luas persegi panjang, tetapi mewakili permukaan 2D berbentuk arbitrer. Untuk mengaktifkan penempatan pada permukaan 2D ini yang berinteraksi dengan quad lingkungan 3D menawarkan utilitas untuk memungkinkan interaksi ini. Saat ini Scene Understanding menyediakan dua fungsi seperti itu, FindCentermostPlacement dan GetSurfaceMask. FindCentermostPlacement adalah API tingkat tinggi yang menemukan posisi pada quad tempat objek dapat ditempatkan dan akan mencoba menemukan lokasi terbaik untuk objek Anda yang menjamin bahwa kotak pembatas yang Anda sediakan akan tetap berada di permukaan yang mendasar.

Catatan

Koordinat output relatif terhadap quad di "quad space" dengan sudut kiri atas (x = 0, y = 0), sama seperti halnya dengan jenis Rect windows lainnya. Pastikan untuk mempertimbangkan hal ini saat bekerja dengan asal-usul objek Anda sendiri.

Contoh berikut menunjukkan cara menemukan lokasi paling tengah yang dapat ditempatkan dan jangkar hologram ke quad.

// 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)
            }
        }
    }
}

Langkah 1-4 sangat bergantung pada kerangka kerja/implementasi khusus Anda, tetapi temanya harus serupa. Penting untuk dicatat bahwa Quad hanya mewakili bidang 2D terikat yang dilokalkan di ruang angkasa. Dengan membuat mesin/kerangka kerja Anda tahu di mana quad dan rooting objek Anda relatif terhadap quad, hologram Anda akan ditempatkan dengan benar sehubungan dengan dunia nyata.

Jala

Jala mewakili representasi geometris objek atau lingkungan. Sama seperti pemetaan spasial, indeks jala, dan data verteks yang disediakan dengan setiap jala permukaan spasial menggunakan tata letak yang sama familier dengan buffer puncak dan indeks yang digunakan untuk merender jala segitiga di semua API penyajian modern. Posisi puncak disediakan dalam sistem koordinat Scene. API tertentu yang digunakan untuk mereferensikan data ini adalah sebagai berikut:

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

Kode berikut memberikan contoh pembuatan daftar segitiga dari struktur jala:

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

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

Buffer indeks/puncak harus >= jumlah indeks/puncak, tetapi sebaliknya dapat berukuran sewenang-wenang yang memungkinkan penggunaan kembali memori yang efisien.

ColliderMesh

Objek adegan menyediakan akses ke data mesh dan collider mesh melalui properti Meshes dan ColliderMeshes. Jala ini akan selalu cocok, yang berarti bahwa indeks i'th dari properti Meshes mewakili geometri yang sama dengan indeks i'th dari properti ColliderMeshes. Jika runtime/objek mendukung jala tabrakan, Anda dijamin akan mendapatkan poligon terendah, perkiraan pesanan tertinggi dan praktik yang baik untuk menggunakan ColliderMeshes di mana pun aplikasi Anda akan menggunakan collider. Jika sistem tidak mendukung tabrakan objek Mesh yang dikembalikan di ColliderMeshes akan menjadi objek yang sama dengan jala yang mengurangi batasan memori.

Mengembangkan dengan pemahaman adegan

Pada titik ini, Anda harus memahami blok penyusun inti dari adegan yang memahami runtime bahasa umum dan SDK. Sebagian besar daya dan kompleksitas terletak pada pola akses, interaksi dengan kerangka kerja 3D, dan alat yang dapat ditulis di atas API ini untuk melakukan tugas yang lebih canggih seperti perencanaan spasial, analisis ruangan, navigasi, fisika, dan sebagainya. Kami berharap untuk menangkap ini dalam sampel yang mudah-mudahan akan memandu Anda ke arah yang tepat untuk membuat skenario Anda bersinar. Jika ada sampel atau skenario yang tidak kami atasi, beri tahu kami dan kami akan mencoba mendokumen/membuat prototipe apa yang Anda butuhkan.

Di mana saya bisa mendapatkan kode sampel?

Kode sampel Pemahaman Adegan untuk Unity dapat ditemukan di halaman Halaman Sampel Unity kami. Aplikasi ini akan memungkinkan Anda untuk berkomunikasi dengan perangkat Anda dan merender berbagai objek adegan, atau, itu akan memungkinkan Anda untuk memuat adegan berseri pada PC Anda dan memungkinkan Anda untuk mengalami Scene Understanding tanpa perangkat.

Di mana saya bisa mendapatkan sampel adegan?

Jika Anda memiliki HoloLens2, Anda dapat menyimpan adegan apa pun yang telah Anda ambil dengan menyimpan output ComputeSerializedAsync untuk mengajukan dan mendeserialisasinya sesuai keinginan Anda sendiri.

Jika Anda tidak memiliki perangkat HoloLens2 tetapi ingin bermain dengan Scene Understanding, Anda harus mengunduh adegan yang telah diambil sebelumnya. Sampel Scene Understanding saat ini dikirim dengan adegan berseri yang dapat diunduh dan digunakan sesuai keinginan Anda sendiri. Anda dapat menemukannya di sini:

Adegan Memahami Adegan Sampel

Lihat juga