Januar 2017
Band 32, Nummer 1
Dieser Artikel wurde maschinell übersetzt.
HoloLens – Einführung in HoloLens, Teil 2: Räumliche Zuordnung
Durch Adam Tuliper | Januar 2017
In meinem letzten Artikel ich drei Säulen der Eingabe für die HoloLens gesprochen – bestaunen, Gestenhandler und voice (msdn.com/magazine/mt788624). Diese Konstrukte können Sie mit der HoloLens und im Gegenzug die Welt um Sie physisch zu interagieren. Sie sind nicht eingeschränkt, funktioniert nur mit ihnen jedoch, da Sie Informationen zu Ihrer Umgebung über eine Funktion namens räumliche Zuordnung aufrufen und das ist können, was ich in diesem Artikel untersuchen.
Wenn ich eine lieblingsfunktion auf die HoloLens auswählen, wäre es räumliche Zuordnung. Räumliche Zuordnung können Sie den Speicherplatz, entweder explizit oder implizit zu verstehen. Arbeiten mit den Informationen, die können explizit gewählt kann, oder ich implizit natürliche physische Interaktionen, wie das Löschen eines virtuellen Balls auf eine physische Tabelle stattfinden können. Mit einigen sehr praktische Updates, die die HoloToolkit aus Asobo Studio ist es vor kurzem raschen für Funktionen in Ihrer Umgebung, z. B. einen Stuhl, Wände und vieles mehr.
Was ist ein 3D-Modell?
Es ist möglicherweise hilfreich zu verstehen, welche ein 3D-Modell ist, bevor Sie betrachten, was eine räumliche Zuordnung des Bereichs darstellt. 3D-Modelle werden diverse Dateiformate, wie z. B. Komposition(en) verwenden oder .blender, aber häufig finden Sie diese in zwei proprietären Autodesk Formaten aufgerufen. FBX (Filmbox) oder. OBJ-Dateien. . FBX-Dateien können nicht nur 3D-Modellinformationen enthalten, sondern auch Animationsdaten, jedoch nicht, gilt für diese Diskussion.
Ein 3D-Modell ist eine relativ einfache-Objekt häufig über Gesicht Vertex Netzen verfolgt nachverfolgen Flächen und Scheitelpunkte. Für fast alle modernen Hardware sind Dreiecke für Flächen verwendet, da Dreiecke am einfachsten Polygone sind. In einem 3D-Modell finden Sie eine Liste aller Scheitelpunkte im Modell (bestehend aus X, y, Z-Werte im Raum); eine Liste der Vertex-Indizes, die jedes Dreieck bilden. Normals, die nur beschreibenden (Pfeile Vektoren) stammen aus jedem Vertex für Beleuchtung Berechnungen verwendet werden, damit Sie, wie wissen sollte zusammen mit dem Modell interagieren; und schließlich UV-Koordinaten – im Wesentlichen X, Y-Koordinaten, die beschreiben, wie Sie ein 2D-Bild, eine Textur aufgerufen werden und Wickeln Sie es um das Modell wie wrapping Papier, damit es so aussehen, als ob es entwickelt wurde. Abbildung 1 zeigt virtuelle Adam, ein Modell, das das Unternehmen XxArray für mich erstellt werden, da auch selbst in einer Szene mit Zombies eingefügt werden soll. Dies ist nur ein 3D-Modell, aber beachten Sie die Abschnitte, die der Scheitelpunkte und Dreiecke gestellt werden und die Hose mal Textur ist, einfach ausgedrückt, umschließt der 3D-Modell der die Beine Hose mal aussehen. Das ist fast alle das Geheimnis von 3D-Modellen.
Abbildung 1 UV-Zuordnung 2D-Textur 3D-Objekt
Wie sieht räumliche Zuordnung aus?
Räumliche Zuordnung ist in gewisser Weise einfacher, da Sie nicht mit den Strukturen der Umgebung arbeiten. Alle in der Regel interessieren hat eine ziemlich genaue Netz erstellt aus Ihrer Umgebung, die ermittelt werden können. Die Umgebung wird überprüft, damit Sie mit ihm interagieren können. Abbildung 2 zeigt ein Szenario etwas mehr wie Sie tatsächlich erhalten, jedoch frei erfunden. Das Modell auf der linken Seite zeigt die Scheitelpunkte, Dreiecke und Normals. Keine den normalen direkt, natürlich, jedoch finden Sie unter das Ergebnis wie das Objekt schattiert dargestellt wird.
Abbildung 2, was, für das Rendering und die Physik-Engine erforderlich ist
Was Sie bisher in beiden Szenarien 3D-Modell gesehen haben ist ausschließlich für das Rendering und absolut nichts (noch) mit der Physik zu tun hat. Die Gliederung grün auf der rechten Seite in Abbildung 2 ist die Form, von der Collider habe ich aus dem Cube verschoben, an einem Punkt; Dies ist die Komponente, die den Bereich der Physik-System definiert. Nach Wunsch vollständig interagieren mit der ganzen Welt auf die HoloLens, ein Spiel oder in 3D Erfahrungen, wirklich, Sie benötigen einen Collider für die Physik-System verwenden.
Wenn Sie die HoloLens aktivieren und in der Shell Hologramm, ist es immer Ihre Umgebung zuordnen. Die HoloLens tut dies, um zu verstehen, wo die Fenster. Wenn ich mein Haus mit der HoloLens durchlaufen, wird es immer seine Informationen über meine Umgebung aktualisiert. Dies dient zwei Zwecken: Zunächst beim vorgestellt in sollte ein Raum, den ich in früher die HoloLens waren anzeigen Windows ich geöffnet war. Zweitens Umgebungen immer ändern und diese Änderungen feststellen werden muss. Stellen Sie sich die folgenden gängigen Szenarien: jemand führt vor mir, meine Kinder im Haus um ausgeführt werden, unsere Haustiere führt Sie durch und erstellt eine große okklusionsabfragen Zone über wird nicht angezeigt. Der Punkt ist die Umgebung wird möglicherweise immer geändert, und die HoloLens ist die Suche nach diesen Änderungen. Vor der Sammelsuche der API, sehen wir die räumliche Zuordnung in der Praxis (und Übrigens habe ich nicht mehr einem echten Haustieren Bären).
Um räumliche Zuordnung in Aktion anzuzeigen, können Sie mit der Windows-Device-Portal auf einer HoloLens verbinden, die Dies ermöglicht eine Remoteverwaltung und Anzeigen des Geräts, z. B. ein 30 FPS livevideostream von was auf das Gerät angezeigt wird. Die Device-Portal kann für nahezu alle Windows 10-Geräte ausgeführt werden. Es ist möglich möglicht, um die IP-Adresse des Geräts oder 127.0.0.1:10080 für Geräte, die über USB angeschlossen wird, sobald die HoloLens in der Developer-Einstellungen aktiviert worden ist. Die meisten Windows 10-Geräte können für ein Gerät Portal aktiviert werden, wie unter bit.ly/2f0cnfM. Abbildung 3 und Abbildung 4 anzeigen, die räumliche Netz aus der 3D-Ansicht im Portal Gerät abgerufen. Abbildung 3 zeigt, was die HoloLens angezeigt wird, als ich ihn zu aktivieren, während er sich Abbildung 4 zeigt die Ansicht nach meinem Wohnzimmer kurz erörtert. Beachten Sie den Vorsitz neben der entfernten Wand auf der rechten Seite, die später angezeigt wird (in Abbildung 9) bei der frage der räumlichen Verständnis-Bibliothek, um mir eine sittable Oberfläche finden.
Abbildung 3 HoloLens räumliche rechts Mesh nach HoloLens in einen neuen Raum aktiviert ist:
Abbildung 4 HoloLens räumliche Mesh nach eine kurze exemplarische Vorgehensweise einen Teil des Raums
Wie räumliche Zuordnung funktioniert
Räumliche Zuordnung funktioniert über ein SurfaceObserver, wie Sie Fläche Volumes beobachten sind, Überwachen der neuen, aktualisiert und entfernt Flächen. Alle Typen, denen Sie verwenden müssen, mit Unity standardmäßig stammen. Sie benötigen keine zusätzlichen Bibliotheken, obwohl das HoloToolkit Unity-Repository auf GitHub besitzt viele Funktionen, für die HoloLens, einschließlich einige erstaunliche Fläche erkennen, die ich später ansehen werden dieses Repository für erreichen los berücksichtigt werden sollen.
Zunächst geben Aufschluss über die SurfaceObserver, dass Sie ein Volume beobachtet werden:
public Vector3 Extents = new Vector3(10, 10, 10);
observer = new SurfaceObserver();
// Start from 0,0,0 and fill in a 10 meter cube volume
// as you explore more of that volume area
observer.SetVolumeAsAxisAlignedBox(Vector3.zero,Extents);
Je größer die Region, desto größer die "Kosten", die auftreten können. Gemäß der Dokumentation räumliche Zuordnung scannt in 70 Grad Kegels einen Bereich zwischen 0,8 und 3.1 Meter – etwa 10 Fuß (den Status Dokumente, die diese Werte in der Zukunft ändern können). Ein Objekt sofort weiter befindet, wird nicht gescannt werden, bis die HoloLens näher darauf erhält. Behalten auch 0,8 Meter gewährleistet, dass es sich bei Hände des Benutzers wird nicht versehentlich als Bestandteil von räumlichen Netz des Raums werden.
Der Prozess zum Abrufen von räumlichen Daten in eine Anwendung ist wie folgt:
- Benachrichtigen Sie die SurfaceObserver eines A-Größe und Form b beobachten
- Bitten Sie in einem vordefinierten Intervall (z. B. alle drei Sekunden) die SurfaceObserver für ein Update, wenn Sie auf andere Ergebnisse zu verarbeitenden warten sind nicht. (Es empfiehlt sich nicht, Ergebnisse überschneiden, können ein Netz, die abgeschlossen werden, bevor die nächste verarbeitet wird.)
- Entwurfsoberfläche Beobachter können Sie das wissen, ob eine hinzufügen, aktualisieren oder Entfernen eines Datenträgers Fläche.
- Bei einer hinzufügen oder aktualisieren an Ihre bekannten räumliche Netz:
- Bereinigen Sie alte Oberfläche, falls für diese Id vorhanden.
- (Um Arbeitsspeicher, gespeichert, wenn Sie eine Fläche, die verwendet wird.) wiederverwenden, oder eine neue SurfaceObject mit Netz, Collider und World Anchor-Komponenten zuweisen.
- Stellen Sie eine Async-Anforderung an die Mesh-Daten zu integrieren.
- Ist ein entfernen, entfernen Sie das Volume, und deaktivieren Sie es so, dass Sie das Spiele Objekt später wiederverwendet werden können (Dies verhindert, dass zusätzliche Zuordnungen und daher weniger Garbage Collections).
Räumliche Zuordnung ist SpatialPerception eine erforderliche Funktion in einer universellen Windows-Plattform (UWP)-app. Da ein Benutzer bewusst sein sollten, dass eine Anwendung den Raum überprüfen kann, muss dies bei, der in die Funktionen entweder in den Einstellungen der Unity-Player Siehe Abbildung 5, oder manuell in der Anwendung "Package.appxmanifest" hinzugefügt.
Abbildung 5: Hinzufügen von SpatialPerception in Datei-Buildeinstellungen
Die räumliche Netze in Surface Volumes verarbeitet, die sich aus dem umgebenden Volume für die SurfaceObserver beobachten definiert wird. Der Schlüssel ist, sobald der SurfaceObserver_OnSurface-Delegat aufgerufen wird, um die Fläche Volume Änderungen beachten, die Sie anfordern, dass die Änderungen in den nächsten Frame. Die Netze werden dann in einem Vorgang namens Systemverwaltungssoftware vorbereitet, und ein SurfaceObserver_OnDataReady Rückruf wird verarbeitet, wenn das Netz bereit ist.
Systemverwaltungssoftware ist ein standard Begriff in das 3D-Universum, das in der Regel etwas im Voraus berechnen auf. Es dient normalerweise zum Berechnen von Beleuchtungsinformationen sprechen und Übertragung an einen speziellen Bild eine Lightmap im baking Prozess aufgerufen. Lightmaps vermeiden Runtime Berechnungen. Ein Netz Systemverwaltungssoftware dauert mehrere Frames von der Zeit, die Sie danach in der Update-Funktion Fragen (siehe Abbildung 6). Aus Gründen der Leistung fordern Sie des Netzes nur von RequestMeshAsync an, wenn Sie tatsächlich Vorhaben, andernfalls verwenden, klicken Sie zusätzliche Verarbeitung, wenn Sie es ohne Grund integrieren.
Abbildung 6 die Update-Funktion
private void Update()
{
// Only do processing if you should be observing.
// This is a flag that should be turned on or off.
if (ObserverState == ObserverStates.Running)
{
// If you don't have a mesh creation pending but you could
// schedule a mesh creation now, do it!
if (surfaceWorkOutstanding == false && surfaceWorkQueue.Count > 0)
{
SurfaceData surfaceData = surfaceWorkQueue.Dequeue();
// If RequestMeshAsync succeeds, then you've scheduled mesh creation.
// OnDataReady is left out of this demo code, as it performs
// some basic cleanup and sets some material/shadow settings.
surfaceWorkOutstanding = observer.RequestMeshAsync(surfaceData,
SurfaceObserver_OnDataReady);
}
// If you don't have any other work to do, and enough time has passed since
// previous update request, request updates for the spatial mapping data.
else if (surfaceWorkOutstanding ==
false && (Time.time - updateTime) >= TimeBetweenUpdates)
{
// You could choose a new origin here if you need to scan
// a new area extending out from the original or make Extents bigger.
observer.SetVolumeAsAxisAlignedBox(observerOrigin, Extents);
observer.Update(SurfaceObserver_OnSurfaceChanged);
updateTime = Time.time;
}
}
}
private void SurfaceObserver_OnSurfaceChanged(
SurfaceId id, SurfaceChange changeType, Bounds bounds, System.DateTime updateTime)
{
GameObject surface;
switch (changeType)
{
case SurfaceChange.Added:
case SurfaceChange.Updated:
// Create (or get existing if updating) object on a custom layer.
// This creates the new game object to hold a piece
// of the spatial mesh.
surface = GetSurfaceObject(id.handle, transform);
// Queue the request for mesh data to be handled later.
QueueSurfaceDataRequest(id, surface);
break;
case SurfaceChange.Removed:
// Remove surface from list.
// ...
break;
}
}
Der Update-Code wird jeder Frame als zuständig für das Abrufen der räumlichen Netze Spiel Objekt aufgerufen.
Wenn Fläche Volume Systemverwaltungssoftware über RequestMeshAsync angefordert wird, wird die Anforderung übergeben eine SurfaceData-Struktur, in der Sie die Überprüfung Dichte (Lösung) angeben können, in Dreiecke pro kubische Meter verarbeiten. Wenn TrianglesPerCubicMeter größer als 1000 ist, erhalten Sie ziemlich smooth Ergebnisse, die mehrere Flächen genau übereinstimmen, die Sie überprüfen möchten. Auf der anderen Seite, je geringer die Anzahl der Dreieck, desto besser die Leistung. Eine Auflösung von < 100 ist sehr schnell, aber Sie Fläche Details verlieren, daher empfehle ich 500 zu starten und Anpassen von dort aus versucht. Abbildung 7 etwa 500 TrianglesPerCubicMeter verwendet. Die HoloLens ist bereits einige Optimierungen des Netzes, damit Sie müssen die Leistung testen Ihre Anwendung und die Feststellung stellen, ob überprüfen und korrigieren Sie weitere (verwenden Sie weniger Arbeitsspeicher) oder vielleicht mit einer höheren Auflösung, das ist einfacher, aber mehr Arbeitsspeicher verwendet werden soll.
Abbildung 7 eine virtuelle Zeichen erkennen und auf einen realen Artikel (aus der Fragmente-Anwendung)
Die räumliche Vernetzung ist eine extrem hohe Auflösung Prozess beabsichtigt nicht, da es sich bei höherer Auflösung gleich deutlich mehr Leistung und in der Regel nicht erforderlich, für die Interaktion mit der Welt, um Sie. Sie werden verwenden nicht räumliche Zuordnung eine sehr detaillierte kleine Figurine auf Ihre Arbeitsplatte erfassen – das ist, was sie für geeignet ist nicht. Es gibt zahlreiche softwarelösungen, jedoch über ein Verfahren namens Photogrammetry, die zum Erstellen von 3D-Modellen aus Bilder, z. B. Microsoft-3D Generator verwendet werden kann und viele andere am bit.ly/2fzcH1z und bit.ly/1UjAt1e. Die HoloLens nicht beinhalten alles, was zum Scannen und strukturierte 3D-Modelle, erfassen aber finden Sie Clientanwendungen zum Erstellen von 3D-Modellen auf die HoloLens, z. B. HoloStudio, oder in 3D-Generator (oder in jeder 3D Modellieren von Software thematisch) zu erstellen und einbinden Unity für die HoloLens verwendet werden können. Sie können jetzt auch Stream Modelle aus Unity die HoloLens während der Entwicklung mit der neuen Hologramm Emulation in Unity 5.5 Leben.
Mesh-collider in Unity sind die sich am wenigsten leistungsfähig, aber sie sind für Flächen, die nicht primitive Formen wie Textfelder und Sphären entsprechen. Weitere Dreiecke hinzufügen, auf den Flächen und Netz-collider hinzugefügt werden, können Sie die Physik Leistung auswirken. SurfaceData der letzte Parameter gibt an, ob einen Collider integrieren:
SurfaceData surfaceData = new SurfaceData(id,
surface.GetComponent<MeshFilter>(),
surface.GetComponent<WorldAnchor>(),
surface.GetComponent<MeshCollider>(),
TrianglesPerCubicMeter,
bakeCollider);
Nie benötigen Sie einen Collider räumliche Netzes (und daher BakeCollider übergeben = False) Wenn Sie nur Funktionen im Bereich des Benutzers erkannt werden sollen, aber nicht in der Physik-System integrieren lassen. Wählen Sie mit Bedacht aus.
Es gibt viele Aspekte für die Überprüfung Erfahrung beim räumliche Zuordnung mit. Clientanwendungen können nicht zu scannen, Scannen nur einen Teil der Umgebung oder Benutzer dazu auffordern, die ihrer Umgebung bestimmte Größe Oberflächen wie ein Garten nach Überprüfung deaktivieren. Richtlinien für den Entwurf sind auf der Seite "Räumliche Zuordnung Design" Windows-Entwicklungscenter aufgeführt (bit.ly/2gDqQQi) und sind zu berücksichtigen, insbesondere da wertfluss Szenarien kann verschiedene Schönheitsfehler in einführen des Netzes die fallen in drei allgemeine Kategorien beschrieben auf der Seite "Räumliche Zuordnung Design" – Bias, Wahnvorstellungen und Löcher. Ein Workflow würde der Benutzer alles vorab überprüft werden, z. B. am Anfang jeder Sitzung "RoboRaid" finden Sie die entsprechenden Flächen für das Spiel arbeiten erfolgt. Wenn Sie die entsprechende Flächen verwenden gefunden haben, wird die Erfahrung beginnt und verwendet die Netze, die bereitgestellt wurden. Ein anderer Workflow ist dann Scan ständig in kleineren realen Änderungen gefunden voraus scannen.
Arbeiten mit räumlichen Netz
Sobald das Netz erstellt wurde, können Sie auf verschiedene Weise mit ihm interagieren. Wenn Sie die HoloToolkit verwenden, wurde räumliche Netz mit einem benutzerdefinierten Layer-Attribut erstellt. In Unity können Sie ignorieren oder Ebenen in verschiedene Vorgänge einschließen. Sie können einen unsichtbar Pfeil fotografieren, in ein allgemeiner Vorgang eine Raycast aufgerufen, und wird zurückgegeben, die sich aus, denen sie in der optional angegebenen Ebene erreicht.
Häufig soll Hologramme in meiner Umgebung, in einer Tabelle platzieren, oder, wie auch in "Young Conker" (bit.ly/2f4Ci4F), geben Sie einen Speicherort für das Zeichen, das Markieren eines Bildbereichs in der realen Welt (über räumliche Mesh), wechseln zu verschieben. Sie müssen wissen, wo Sie mit der physischen Welt überlappen können. Der Code in Abbildung 8 führt eine Raycast, 30 Meter, jedoch wird nur die Bereiche des Netzes räumliche Zuordnung Treffer gemeldet. Auf dieser Ebene sind andere Hologramme ignoriert.
Abbildung 8 eine Raycast ausführen
// Do a raycast into the world that will only hit the Spatial Mapping mesh.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
// Ensure you specify a length as a best practice. Shorter is better as
// performance hit goes up roughly linearly with length.
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
10.0f, SpatialMappingManager.Instance.LayerMask))
{
// Move this object to where the raycast hit the Spatial Mapping mesh.
this.transform.position = hitInfo.point;
// Rotate this object to face the user.
Quaternion rotation = Camera.main.transform.localRotation;
rotation.x = 0;
rotation.z = 0;
transform.rotation = rotation;
}
Ich muss keine räumlichen Mesh natürlich verwenden. Wenn ein Hologramm angezeigt und der Benutzer in der Lage, es zu platzieren, wo er möchte, dass sein soll (vielleicht es immer folgt ihm) und es werden niemals mit der physikalischen Umgebung integrieren, sicherlich nicht benötige eine Raycast oder sogar die Mesh-Collider.
Jetzt wollen wir jetzt etwas Spaß mit dem Netz. Ich möchte, um herauszufinden, wie viel in meinem Wohnzimmer ein Bereich vorhanden ist, dass ein Zeichen Hinsetzen konnte, in die Szene Abbildung 7, also aus "Fragmente," eine erstaunliche fast 5 Stunden Rätsel lösen Erfahrung für die HoloLens, die virtuelle sitzen manchmal in Ihrem Zeichen enthält. Ein Teil des Codes, die durchlaufen werden aus der HoloToolkit ist. Sie stammt Asobo Studio gearbeitet "Fragmente." Da dies tatsächlich kombiniert wird, ist es einfach großartig entwickeln, Mischung die realen Welt mit der virtuellen Welt auftritt. Abbildung 9 ist das Endergebnis eine HoloToolkit-Beispiele – SpatialUnderstandingExample Szene, die ich in meinem Wohnzimmer ausgeführt haben. Beachten Sie, dass es mehrere Speicherorte angibt, die als sittable Bereiche identifiziert wurden.
Abbildung 9: die HoloToolkit SpatialUnderstanding-Funktionalität
Das gesamte Codebeispiel dafür ist in der HoloToolkit, aber wir durch den Prozess geführt. Ich habe nun den Code in die entsprechenden Teile abgeschnitten. (Ich habe SurfaceObserver bereits gesprochen damit, die in diesem Abschnitt ausgeschlossen werden.) SpatialUnderstandingSourceMesh umschließt die SurfaceObserver über eine SpatialMappingObserver-Klasse zum Verarbeiten von Netzen und erstellt die entsprechenden MeshData-Objekte, für die DLL SpatialUnderstaing übergeben. Die wichtigsten erzwingen dieser API liegt in diese DLL in das HoloToolkit.
Nach Formen in meiner räumliche Netz mithilfe der DLL zu suchen, muss ich das benutzerdefinierte Shape definieren, um habe ich für. Wenn ich eine sittable Fläche zwischen 0,2 und 0,6 Metern auf dem Boden, mindestens eine diskrete flache Oberfläche und Gesamtfläche mindestens 0,2 Meter vorgenommen werden soll, kann ich eine Shape-Definition, die auf der DLL über AddShape übergeben wird erstellen (siehe Abbildung 10).
Abbildung 10: erstellen eine Shape-Definition
ShapeDefinitions.cs
// A "Sittable" space definition.
shapeComponents = new List<SpatialUnderstandingDllShapes.ShapeComponent>()
{
new SpatialUnderstandingDllShapes.ShapeComponent(
new List<SpatialUnderstandingDllShapes.ShapeComponentConstraint>()
{
SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_
SurfaceHeight_Between(0.2f, 0.6f),
SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_
SurfaceCount_Min(1),
SpatialUnderstandingDllShapes.ShapeComponentConstraint.Create_
SurfaceArea_Min(0.20f),
}),
};
// Tell the DLL about this shape is called Sittable.
AddShape("Sittable", shapeComponents);
Als Nächstes können ich die Bereiche erkennen visualisieren und legen dort die Spielobjekte. Ich bin mir nicht nur für eine Form gefragt und Abrufen aller. Wenn sein soll, kann ich meine Abfrage QueryTopology_FindLargePositionsOnWalls oder QueryTopology_FindLargestWall, strukturieren, siehe Abbildung 11.
Abbildung 11: Abfragen von einer Form
SpaceVisualizer.cs (abbreviated)
const int QueryResultMaxCount = 512;
private ShapeResult[] resultsShape = new ShapeResult[QueryResultMaxCount];
public GameObject Beacon;
public void FindSittableLocations()
{
// Pin managed object memory going to native code.
IntPtr resultsShapePtr =
SpatialUnderstanding.Instance.UnderstandingDLL.
PinObject(resultsShape);
// Find the half dimensions of "Sittable" objects via the DLL.
int shapeCount = SpatialUnderstandingDllShapes.QueryShape_FindShapeHalfDims(
"Sittable",
resultsShape.Length, resultsShapePtr);
// Process found results.
for(int i=0;i<shapeCount;i++)
{
// Create a beacon at each "sittable" location.
Instantiate(Beacon, resultsShape[i].position, Quaternion.identity);
// Log the half bounds of our sittable area.
Console.WriteLine(resultsShape[i].halfDims.sqrMagnitude < 0.01f) ?
new Vector3(0.25f, 0.025f, 0.25f) : resultsShape[i].halfDims)
}
}
Es gibt auch eine Solver in der HoloToolkit, die Sie Kriterien wie z. B. "Create 1,5 Meter von anderen Objekten" zur Verfügung stellen kann:
List<ObjectPlacementRule> rules =
new List<ObjectPlacementRule>() {
ObjectPlacementRule.Create_AwayFromOtherObjects(1.5f),
};
// Simplified api for demo purpose – see LevelSolver.cs in the HoloToolkit.
var queryResults = Solver_PlaceObject(....)
Nach dem Ausführen der vorherigen Abfrage, um ein Objekt zu platzieren, erhalten Sie eine Liste der Ergebnisse, die Sie bei der Ermittlung des Speicherorts, Grenzen und direktionale Vektoren finden Sie die Ausrichtung der Oberfläche verwenden können:
public class ObjectPlacementResult
{
public Vector3 Position;
public Vector3 HalfDims;
public Vector3 Forward;
public Vector3 Right;
public Vector3 Up;
};
Zusammenfassung
Räumliche Zuordnung können Sie wirklich mit der Welt, um Sie zu integrieren und engagieren Sie sich in gemischten Realität Erfahrungen. Sie können einen Benutzer, um ihre Umgebung zu überprüfen, und geben Sie ihr Feedback zu was Sie gefunden haben, sowie ihre Umgebung für Ihre Hologramme mit ihr interagieren – bestimmen geführt. Es gibt keine anderen Gerät wie z. B. die HoloLens für Welten mischen. Auschecken HoloLens.com und Entwickeln von atemberaubenden Erfahrungen noch heute. Als Nächstes Zeitgründen werde ich freigegebene Erfahrungen auf die HoloLens. Halten Sie bis dahin entwickeln!
ADAM Tuliperist als senior technical Evangelist bei Microsoft im sonnigen SoCal Leben. Er ist eine bei der Webentwicklung Dev-Spiel Pluralsight.com Autor und Bestrebens Tech fasziniert. Suchen Sie ihn auf Twitter: @AdamTuliper oder adamtuliper.com.
Unser Dank gilt dem folgenden technischen Microsoft-Experten für die Durchsicht dieses Artikels:Jackson-Felder