Přehled sady SDK pro porozumění scéně

Porozumění scéně transformuje data snímačů nestrukturovaného prostředí, která vaše Mixed Reality zařízení zachytává, a převádí je do výkonné abstraktní reprezentace. Sada SDK funguje jako komunikační vrstva mezi vaší aplikací a modulem runtime Scene Understanding. Jeho cílem je napodobovat stávající standardní konstrukce, jako jsou grafy 3D scény pro 3D reprezentace a 2D obdélníky a panely pro 2D aplikace. Zatímco konstruktory Scene Understanding mimiky budou mapovat na konkrétní architektury, SceneUnderstanding je obecně architektura nezávislá na architektuře, což umožňuje interoperabilitu mezi různými architekturami, které s ním interagují. S tím, jak se služba Scene Understanding vyvíjí, je úlohou sady SDK zajistit, aby byly nové reprezentace a možnosti nadále zpřístupněny v rámci sjednocené architektury. V tomto dokumentu nejprve představíme základní koncepty, které vám pomůžou seznámit se s vývojovým prostředím a využitím a pak poskytneme podrobnější dokumentaci ke konkrétním třídám a konstruktorům.

Kde získám sadu SDK?

Sada SceneUnderstanding SDK je ke stažení prostřednictvím nástroje Mixed Reality Feature Tool.

Poznámka: Nejnovější verze závisí na balíčcích Preview a budete muset povolit předběžné verze balíčků, aby se zobrazila.

Pro verzi 0.5.2022-rc a novější podporuje Scene Understanding jazykové projekce pro C# a C++ umožňující aplikacím vyvíjet aplikace pro platformy Win32 nebo UPW. Od této verze podporuje SceneUnderstanding podporu unity v editoru, a to bez použití SceneObserveru, který se používá výhradně pro komunikaci s HoloLens2.

SceneUnderstanding vyžaduje sadu Windows SDK verze 18362 nebo novější.

Koncepční přehled

Scéna

Zařízení s hybridní realitou neustále integruje informace o tom, co vidí ve vašem prostředí. Pochopení scény trychtýří všechny tyto zdroje dat a vytvoří jednu soudržnou abstrakci. Porozumění scéně vygeneruje scény, které jsou složením objektů SceneObject , které představují instanci jedné věci (například stěna, strop nebo podlaha). Objekty scény samotné jsou složením [SceneComponents, které představují podrobnější části, které tvoří tento objekt SceneObject. Příklady komponent jsou kvadráty a sítě, ale v budoucnu by mohly představovat ohraničující rámečky, kolizní sítě, metadata atd.

Proces převodu nezpracovaných dat senzoru na scénu je potenciálně nákladná operace, která může trvat sekundy u středních prostorů (~10x10m) až minut u velkých prostorů (~50x50m), a proto zařízení bez žádosti aplikace nevypočítává. Místo toho je generování scén aktivováno vaší aplikací na vyžádání. Třída SceneObserver má statické metody, které mohou vypočítat nebo deserializovat scénu, kterou pak můžete vytvořit výčet nebo s nimi pracovat. Akce Compute se provádí na vyžádání a provádí se na procesoru, ale v samostatném procesu (ovladač Mixed Reality). Zatímco ale provádíme výpočty v jiném procesu, výsledná data scény se ukládají a uchovávají ve vaší aplikaci v objektu Scene.

Níže je diagram, který znázorňuje tento tok procesu a ukazuje příklady dvou aplikací vzájemně propojených s modulem runtime Scene Understanding.

Diagram procesu

Na levé straně je diagram modulu runtime hybridní reality, který je vždy zapnutý a spuštěný ve vlastním procesu. Tento modul runtime je zodpovědný za provádění sledování zařízení, prostorového mapování a dalších operací, které služba Scene Understanding používá k pochopení a vysvětlení světa kolem vás. Na pravé straně diagramu si ukážeme dvě teoretické aplikace, které využívají funkci Porozumění scéně. První aplikace používá rozhraní MRTK, která interně používá sadu Scene Understanding SDK, druhá aplikace počítá a používá dvě samostatné instance scény. Všechny tři scény v tomto diagramu generují různé instance scén, ovladač neslouží globální stav, který se sdílí mezi aplikacemi, a objekty scény v jedné scéně se v jiné scéně nenacházejí. Funkce Scene Understanding poskytuje mechanismus pro sledování v průběhu času, ale to se provádí pomocí sady SDK. Sledovací kód už je spuštěný v sadě SDK v procesu vaší aplikace.

Vzhledem k tomu, že každá scéna ukládá svá data v paměťovém prostoru aplikace, můžete předpokládat, že všechny funkce objektu Scene nebo jeho interní data jsou vždy spuštěny v procesu vaší aplikace.

Layout

Při práci se službou Scene Understanding může být užitečné vědět a pochopit, jak modul runtime představuje komponenty logicky a fyzicky. Scéna představuje data s konkrétním rozložením, které bylo zvoleno jako jednoduché při zachování základní struktury, která je zodpovědná za splnění budoucích požadavků bez nutnosti velkých revizí. Scéna to dělá tak, že všechny komponenty (stavební bloky pro všechny objekty scény) uloží do plochého seznamu a definuje hierarchii a složení prostřednictvím odkazů, kde konkrétní komponenty odkazují na jiné.

Níže uvádíme příklad struktury v její ploché i logické podobě.

Logické rozloženíFyzické rozložení
    Scény
    • 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

Tento obrázek znázorňuje rozdíl mezi fyzickým a logickým rozložením scény. Vlevo vidíme hierarchické rozložení dat, která vaše aplikace vidí při vytváření výčtu scény. Na pravé straně vidíme, že scéna se skládá z 12 různých komponent, které jsou v případě potřeby přístupné jednotlivě. Při zpracování nové scény očekáváme, že aplikace budou tuto hierarchii procházet logicky, ale při sledování aktualizací mezi scénami můžou mít některé aplikace zájem o cílení pouze na konkrétní komponenty, které jsou sdílené mezi dvěma scénami.

Přehled rozhraní API

Následující část poskytuje základní přehled konstruktorů v části Scene Understanding. Při čtení této části získáte přehled o tom, jak jsou scény reprezentovány a k čemu se různé komponenty používají. V další části najdete konkrétní příklady kódu a další podrobnosti, které jsou v tomto přehledu popsány.

Všechny níže popsané typy se nacházejí v Microsoft.MixedReality.SceneUnderstanding oboru názvů.

SceneComponents

Teď, když rozumíte logickému rozložení scén, můžeme představit koncept SceneComponents a způsob jejich použití k vytváření hierarchie. SceneComponents jsou nejpodrobnější rozklady v SceneUnderstanding představující jednu základní věc, například síť, čtyřúhelník nebo ohraničující rámeček. SceneComponents jsou věci, které se můžou nezávisle aktualizovat a na které můžou odkazovat jiné sceneComponents, a proto mají jedinou globální vlastnost, jedinečné ID, které umožňují tento typ mechanismu sledování/odkazování. ID se používají pro logické složení hierarchie scén i pro trvalost objektů (akt aktualizace jedné scény vzhledem k jiné).

Pokud zacházíte s každou nově vypočítanou scénou jako s odlišnou a jednoduše v ní vytváříte výčet všech dat, jsou ID pro vás do značné míry transparentní. Pokud ale plánujete sledovat komponenty v několika aktualizacích, použijete ID k indexování a hledání komponent SceneComponents mezi objekty Scene.

SceneObjects

SceneObject je součást scény, která představuje instanci "věci", například zdi, podlahy, stropu atd.... vyjádřeno jejich vlastností Kind. Objekty SceneObject jsou geometrické, a proto mají funkce a vlastnosti, které představují jejich umístění v prostoru, ale neobsahují žádnou geometrickou ani logickou strukturu. Místo toho, SceneObjects odkazuje na jiné SceneComponents, konkrétně SceneQuads, a SceneMeshes, které poskytují různé reprezentace, které jsou podporovány systémem. Při výpočtu nové scény vaše aplikace s největší pravděpodobností vytvoří výčet objektů SceneObjects scény, aby zpracovala, co ji zajímá.

Objekty SceneObject můžou mít některou z následujících možností:

SceneObjectKind Popis
PozadíSceneObject je známo, že není jedním z ostatních rozpoznaných druhů objektů scény. Tato třída by neměla být zaměňována s neznámým, kde pozadí není známo, že není stěna / podlaha / strop atd.... zatímco neznámý ještě není zařazený do kategorií.
ZdiFyzická zeď. Stěny jsou považovány za nepohyblivé ekologické struktury.
FloorPodlahy jsou všechny povrchy, po kterých lze chodit. Poznámka: Schody nejsou podlahy. Všimněte si také, že podlahy mají jakýkoli pochostupný povrch, a proto neexistuje žádný explicitní předpoklad singulární podlahy. Víceúrovňové konstrukce, rampy atd. by měly všechny klasifikovat jako podlahu.
CeilingHorní povrch místnosti.
PlatformaVelký plochý povrch, na který můžete umístit hologramy. Obvykle představují tabulky, pracovní desky a další velké vodorovné plochy.
SvětVyhrazený popisek pro geometrická data, která jsou nezávislá na popisování. Síť vygenerovaná nastavením příznaku aktualizace EnableWorldMesh by se klasifikovala jako world.
NeznámýTento objekt scény ještě nebyl klasifikován a přiřazen druhem. To by se nemělo zaměňovat s pozadím, protože to může být cokoli, systém prostě ještě nepřišel s dostatečně silnou klasifikací pro něj.

SceneMesh

SceneMesh je SceneComponent, který přibližuje geometrii libovolných geometrických objektů pomocí trojúhelníkového seznamu. SceneMeshes jsou použity v několika různých kontextech; mohou představovat komponenty vodotěsné struktury buněk nebo jako WorldMesh, který představuje neohraničovanou prostorovou mapovací síť přidruženou ke Scéně. Data indexu a vrcholu, která jsou součástí každé sítě, používají stejné známé rozložení jako vyrovnávací paměti vrcholů a indexů , které se používají pro vykreslování trojúhelníkových sítí ve všech moderních rozhraních API pro vykreslování. Ve službě Porozumění scéně sítě používají 32bitové indexy a u některých vykreslovacích modulů může být potřeba je rozdělit na bloky.

Pořadí vinutí a souřadnicové systémy

Očekává se, že všechny sítě vytvořené porozuměním scéně vrátí sítě v Right-Handed souřadnicovém systému pomocí pořadí vinutí po směru hodinových ručiček.

Poznámka: Buildy operačního systému starší než .191105 můžou mít známou chybu, kdy se sítě "World" vracely ve Counter-Clockwise pořadí vinutí, což bylo následně opraveno.

ScénaQuad

SceneQuad je SceneComponent, který představuje 2d povrchy, které zabírají 3D svět. SceneQuads se dají používat podobně jako ARKit ARPlaneAnchor nebo ARCore Plane, ale nabízejí vyšší funkčnost jako 2D plátna, která se používají v plochých aplikacích, nebo rozšířené uživatelské rozhraní. Rozhraní API specifická pro 2D jsou k dispozici pro čtyřúhelníky, které usnadňují umístění a rozložení, a vývoj (s výjimkou vykreslování) s čtyřúhelníkem by se měl při práci s 2d plátny více podobat práci s 2d plátny než 3D sítěmi.

SceneQuad shape

SceneQuads definuje ohraničený obdélníkový povrch ve 2d. SceneQuads však představují povrchy s libovolnými a potenciálně složitými obrazci (například prstencovým tvarem tabulky). K reprezentaci složitého tvaru povrchu čtyřúhelníku můžete použít rozhraní API GetSurfaceMask k vykreslení tvaru povrchu na obrazovou vyrovnávací paměť, kterou poskytnete. Pokud objekt SceneObject, který obsahuje čtyřúhelník, má také síť, měly by být trojúhelníky sítě ekvivalentní tomuto vykreslenému obrázku. Oba představují skutečnou geometrii povrchu ve 2d nebo 3d souřadnicích.

Podrobnosti a reference k sadě SDK pro porozumění scéně

Poznámka

Pokud používáte MRTK, mějte na paměti, že budete pracovat s mrtk ['WindowsSceneUnderstandingObserver'](xref:Microsoft.MixedReality.Toolkit.WindowsSceneUnderstanding.Experimental.WindowsSceneUnderstandingObserver?view=mixed-reality-toolkit-unity-2020-dotnet-2.8.0&preserve-view=true), a proto může tuto část ve většině případů přeskočit. Další informace najdete v dokumentu [MRTK Scene Understanding docs](/windows/mixed-reality/mrtk-unity/features/spatial-awareness/scene-understanding).

Následující část vám pomůže seznámit se se základy funkce SceneUnderstanding. Tato část by vám měla poskytnout základní informace. V tomto okamžiku byste měli mít dostatek kontextu, abyste si prošli ukázkové aplikace a zjistili, jak se SceneUnderstanding používá holisticky.

Inicializace

Prvním krokem při práci s SceneUnderstanding je, aby vaše aplikace získala odkaz na objekt Scene. To lze provést jedním ze dvou způsobů, scénu lze vypočítat buď ovladačem, nebo existující scéna, která byla vypočtena v minulosti, lze de-serializovat. Druhá možnost je užitečná pro práci s funkcí SceneUnderstanding během vývoje, kdy je možné rychle vytvářet prototypy aplikací a prostředí bez zařízení pro hybridní realitu.

Scény se počítají pomocí SceneObserveru. Před vytvořením scény by se aplikace měla dotázat na vaše zařízení, aby se ujistila, že podporuje SceneUnderstanding, a také požádat uživatele o přístup k informacím, které SceneUnderstanding potřebuje.

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

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

Pokud se nevolá RequestAccessAsync(), výpočet nové scény se nezdaří. V dalším kroku vypočítáme novou scénu, která je kořenem kolem Mixed Reality náhlavní soupravy a má poloměr 10 metrů.

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

Inicializace z dat (označuje se také jako cesta počítače)

Zatímco scény lze vypočítat pro přímé použití, mohou být také vypočítány v serializované podobě pro pozdější použití. Ukázalo se, že je to užitečné pro vývoj, protože umožňuje vývojářům pracovat a testovat porozumění scéně bez nutnosti zařízení. Serializace scény je téměř shodná s jejím výpočtem, data se vrátí do vaší aplikace místo toho, aby byla deserializována místně sadou SDK. Pak ho můžete sami deserializovat nebo si ho uložit pro budoucí použití.

// 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 – výčet

Teď, když má vaše aplikace scénu, bude objekty SceneObjects sledovat a interagovat s nimi. To se provádí přístupem k vlastnosti SceneObjects :

SceneObject firstFloor = null;

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

Aktualizace komponent a zpřesnění komponent

Existuje další funkce, která načítá komponenty scény s názvem FindComponent. Tato funkce je užitečná při aktualizaci sledovacích objektů a jejich hledání v pozdějších scénách. Následující kód vypočítá novou scénu vzhledem k předchozí scéně a pak najde podlahu v nové scéně.

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

Přístup k sítím a čtyřúhelnímkům z objektů scény

Jakmile se objekty SceneObjects najdou, bude vaše aplikace s největší pravděpodobností chtít získat přístup k datům obsaženým v kvadrupcích nebo sítích, ze kterých se skládá. K datům se přistupuje pomocí vlastností Quads a Meshes . Následující kód zobrazí výčet všech čtyřúhelníku a ok objektu podlahy.


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

Všimněte si, že právě Objekt SceneObject má transformaci relativní k počátek scény. Je to proto, že SceneObject představuje instanci "věci" a je lokalizovatelný v prostoru, čtyřúhelníky a sítě představují geometrii, která je transformována vzhledem k jejich nadřazenému objektu. Samostatné objekty SceneObject můžou odkazovat na stejné objekty SceneMesh/SceneQuad SceneComponents a je také možné, že objekt SceneObject má více než jednu scénu/SceneQuad.

Práce s transformacemi

Funkce Porozumění scéně se při práci s transformacemi záměrně pokusila sladit s tradičními reprezentacemi 3D scén. Každá scéna je proto omezena na jeden souřadnicový systém podobně jako většina běžných 3D reprezentací prostředí. Objekty SceneObject každý z nich poskytují své umístění vzhledem k danému systému souřadnic. Pokud vaše aplikace pracuje se scénami, které roztahují limit toho, co jeden origin poskytuje, může ukotvovat Objekty SceneObjects do SpatialAnchors nebo vygenerovat několik scén a sloučit je dohromady, ale pro jednoduchost předpokládáme, že vodotěsné scény existují ve svém vlastním původu, který je lokalizovaný jedním NodeId definovaným Scene.OriginSpatialGraphNodeId.

Následující kód Unity například ukazuje, jak pomocí rozhraní API Windows Perception a Unity sladit souřadnicové systémy. Podrobnosti o rozhraních WINDOWS Perception API najdete v tématu SpatialCoordinateSystem a SpatialGraphInteropPreview a podrobnosti o získání SpatialCoordinateSystem, který odpovídá světovému původu Unity, Mixed Reality nativní objekty v 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;
}

Každá z nich SceneObject má transformaci, která se pak použije u daného objektu. V Unity převedeme na souřadnice pro pravou ruku a přiřadíme místní transformace takto:

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

Čtyřúhelníky byly navrženy tak, aby pomáhaly scénářům 2D umístění, a měly by se považovat za rozšíření prvků uživatelského prostředí 2D plátna. Zatímco čtyřúhelníky jsou komponentami objektů SceneObjects a dají se vykreslovat ve 3D, rozhraní API pro quad sama předpokládají, že quads jsou 2D struktury. Nabízejí informace, jako je rozsah, tvar a poskytují rozhraní API pro umístění.

Čtyřúhelníky mají obdélníkové rozsahy, ale představují libovolně tvarované 2D plochy. Pokud chcete povolit umístění na těchto 2D površích, které komunikují s 3D prostředím, nabízejí čtyřúhelníky nástroje, které tuto interakci umožňují. V současné době služba Scene Understanding poskytuje dvě takové funkce : FindCentermostPlacement a GetSurfaceMask. FindCentermostPlacement je rozhraní API vysoké úrovně, které vyhledá pozici na čtyřúhelníku, kam lze umístit objekt, a pokusí se najít nejlepší umístění pro váš objekt, což zaručuje, že vámi zadaný ohraničující rámeček zůstane na podkladové ploše.

Poznámka

Souřadnice výstupu jsou relativní vzhledem k čtyřúhelníku v "čtyřúhelníku", přičemž levý horní roh je (x = 0, y = 0), stejně jako u jiných typů oken Rect. Nezapomeňte to vzít v úvahu při práci s počátky vlastních objektů.

Následující příklad ukazuje, jak najít umístění nejvíce uprostřed a ukotvit hologram ke čtyřúhelníku.

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

Kroky 1 až 4 jsou do značné míry závislé na konkrétní architektuře nebo implementaci, ale motivy by měly být podobné. Je důležité si uvědomit, že čtyřúhelník jednoduše představuje ohraničenou 2D rovinu, která je lokalizovaná v prostoru. Díky tomu, že váš modul nebo architektura vědí, kde se čtyřúhelník nachází, a začleníte objekty vzhledem k čtyřúhelníku, budou hologramy umístěny správně s ohledem na skutečný svět.

Smíšená (mesh)

Sítě představují geometrické reprezentace objektů nebo prostředí. Podobně jako prostorové mapování, data indexů sítě a vrcholů, která jsou součástí každé sítě prostorového povrchu, používají stejné známé rozložení jako vyrovnávací paměti vrcholů a indexů, které se používají pro vykreslování trojúhelníkových sítí ve všech moderních rozhraních API pro vykreslování. Pozice vrcholů jsou k dispozici v souřadnicovém Scenesystému . Konkrétní rozhraní API, která se používají k odkazům na tato data, jsou následující:

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

Následující kód obsahuje příklad generování seznamu trojúhelníků ze struktury sítě:

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

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

Vyrovnávací paměti indexu nebo vrcholů musí být >= počet indexů/vrcholů, ale jinak mohou mít libovolnou velikost, což umožňuje efektivní opakované použití paměti.

ColliderMesh

Objekty scény poskytují přístup k datům sítě a s collider mesh prostřednictvím vlastností Meshes a ColliderMeshes. Tyto sítě se budou vždy shodovat, což znamená, že i'th index vlastnosti Meshes představuje stejnou geometrii jako i'th index vlastnosti ColliderMeshes. Pokud modul runtime nebo objekt podporuje sítě s colliderů, máte zaručeno, že získáte nejnižší mnohoúhelník a nejvyšší aproximaci nejvyššího pořadí a je vhodné používat ColliderMeshes všude tam, kde vaše aplikace bude používat kolidéry. Pokud systém nepodporuje kolidery, objekt Mesh vrácený v ColliderMeshes bude stejný objekt jako síť snižující omezení paměti.

Vývoj s porozuměním scéně

V tomto okamžiku byste měli porozumět základním stavebním blokům scény, které rozumí modulu runtime a sadě SDK. Hlavní část výkonu a složitosti spočívá v přístupových vzorech, interakci s 3D architekturami a nástrojích, které je možné na těchto rozhraních API napsat pro pokročilejší úkoly, jako je prostorové plánování, analýza místností, navigace, fyzika atd. Doufáme, že je zachytíme ve vzorcích, které by vás snad měly vést správným směrem, aby vaše scénáře vyzařily. Pokud existují ukázky nebo scénáře, které neřešíme, dejte nám vědět a my se pokusíme zdokumentovat nebo vytvořit prototyp toho, co potřebujete.

Kde získám ukázkový kód?

Scene Understanding vzorový kód pro Unity najdete na naší stránce s ukázkou Unity . Tato aplikace vám umožní komunikovat s vaším zařízením a vykreslovat různé objekty scény, nebo vám umožní načíst serializovanou scénu do počítače a umožní vám zažít porozumění scéně bez zařízení.

Kde najdu ukázkové scény?

Pokud máte HoloLens2, můžete libovolnou zachycenou scénu uložit tak, že uložíte výstup ComputeSerializedAsync do souboru a deserializujete ho podle vlastního uvážení.

Pokud nemáte zařízení HoloLens2, ale chcete si přehrát funkci Porozumění scéně, budete si muset stáhnout předem zachycenou scénu. Ukázka Porozumění scéně se aktuálně dodává se serializovanými scénami, které si můžete stáhnout a použít podle vlastního pohodlí. Najdete je tady:

Porozumění scéně ukázkové scény

Viz také