Wie verwende ich das Microsoft Scene Understanding SDK und hololens2, um die Unity-Szene am physischen Raum des Players auszurichten? [geschlossen]
Wenn der Spieler in eine Einheitsszene in Hololens2 lädt, stimmt die Ebene des Einheitsbodens nicht mit dem physischen Boden überein. Bei hololens2 und MRTK ist der Ursprung der Unity-Szene auf den Kopf des Spielers von 0,0,0 festgelegt.
Ich versuche, das Microsoft Scene Understanding SDK zu verwenden, um die Position Y der Unity Scene-Umgebung auf den Boden im physischen Raum festzulegen. Ich kann derzeit auf das Bodenszenenobjekt zugreifen, aber wenn ich versuche, den SpatialCoordinateSystem-Teil auszuführen, kann ich die .xoUnity () -Methode nicht zum Konvertieren der 4x4-Matrix verwenden. Ich musste den Aufruf von vector3 .ToUnity () in .ToUnityVector3 () ändern. Ich kann jedoch keine ähnliche Methode für die Matrix finden.
Sind die in dieser Dokumentation genannten .ToUnity () -Methoden veraltet? Fehlt mir ein Verweis auf etwas? (siehe Bilder für Referenzen)
Ich freue mich sehr über jede Unterstützung, entweder in dieser speziellen Ausgabe oder über die allgemeine Herausforderung, eine Einheitsszene an die physische Umgebung eines Hololens2-Benutzers anzupassen.
Ich folge den hier bereitgestellten Informationen https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/scene-understanding-sdk



Antworten
Im Vergleich zur Dokumentation haben Sie die Value
Eigenschaft übersehen und die ToUnity()
Methode direkt für das sceneToWorld-Objekt aufgerufen. Dies kann die Ursache des Problems sein.
var sceneToWorldUnity = sceneToWorld.ToUnity();
=>
var sceneToWorldUnity = sceneToWorld.Value.ToUnity();
Hernando - Die Vorschläge von MSFT haben mir die fehlenden ToUnity () - Referenzen geholfen. Die Herausforderung, alle Szenenhologramme auf dem Boden auszurichten, bleibt bestehen, aber das ist ein Fortschritt! Vielen Dank Hernando!
Ich musste im Grunde nur .value hinzufügen, um auf die Matrixdaten zuzugreifen, und dann diesen Namespace implementieren:
namespace NumericsConversion
{
public static class NumericsConversionExtensions
{
public static UnityEngine.Vector3 ToUnity(this System.Numerics.Vector3 v) => new UnityEngine.Vector3(v.X, v.Y, -v.Z);
public static UnityEngine.Quaternion ToUnity(this System.Numerics.Quaternion q) => new UnityEngine.Quaternion(-q.X, -q.Y, q.Z, q.W);
public static UnityEngine.Matrix4x4 ToUnity(this System.Numerics.Matrix4x4 m) => new UnityEngine.Matrix4x4(
new Vector4(m.M11, m.M12, -m.M13, m.M14),
new Vector4(m.M21, m.M22, -m.M23, m.M24),
new Vector4(-m.M31, -m.M32, m.M33, -m.M34),
new Vector4(m.M41, m.M42, -m.M43, m.M44));
public static System.Numerics.Vector3 ToSystem(this UnityEngine.Vector3 v) => new System.Numerics.Vector3(v.x, v.y, -v.z);
public static System.Numerics.Quaternion ToSystem(this UnityEngine.Quaternion q) => new System.Numerics.Quaternion(-q.x, -q.y, q.z, q.w);
public static System.Numerics.Matrix4x4 ToSystem(this UnityEngine.Matrix4x4 m) => new System.Numerics.Matrix4x4(
m.m00, m.m10, -m.m20, m.m30,
m.m01, m.m11, -m.m21, m.m31,
-m.m02, -m.m12, m.m22, -m.m32,
m.m03, m.m13, -m.m23, m.m33);
}
}
Ich habe auch versucht, einen Würfel mit einem starren Körper und einem Kollider zur Laufzeit fallen zu lassen, um den Y-Wert des räumlichen Datenbodens zu bestimmen. Dies scheint tatsächlich relativ gut zu funktionieren, ist aber definitiv nicht die genaueste Lösung.