Comment utiliser le SDK Microsoft Scene Understanding et hololens2 pour aligner la scène Unity sur la salle physique du lecteur? [fermé]
Lorsque le joueur se charge dans une scène d'unité dans Hololens2, le plan Unity Floor ne correspond pas au sol physique. Avec les hololens2 et MRTK, l'origine de la scène Unity est verrouillée sur la tête du joueur à 0,0,0.
J'essaie d'utiliser le SDK Microsoft Scene Understanding pour définir la position Y de l'environnement Unity Scene sur le sol de la salle physique. Je suis actuellement en mesure d'accéder à l'objet de scène de sol, mais lorsque j'essaie de faire la partie SpatialCoordinateSystem, je ne peux pas utiliser la méthode .ToUnity () pour convertir la matrice 4x4. J'ai dû changer l'appel vector3 .ToUnity () en .ToUnityVector3 (); mais je suis incapable de trouver une méthode similaire pour la matrice.
Les méthodes .ToUnity () mentionnées dans cette documentation sont-elles obsolètes? Est-ce que je manque une référence à quelque chose? (voir les images pour les références)
J'apprécie grandement toute aide ici, que ce soit dans ce numéro spécifique, ou le défi global d'aligner une scène d'unité à l'environnement physique d'un utilisateur Hololens2.
Je suis les informations fournies ici https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/scene-understanding-sdk



Réponses
Par rapport à la documentation , vous avez manqué la Value
propriété et ToUnity()
avez appelé la méthode directement sur l'objet sceneToWorld. Cela peut être la cause du problème.
var sceneToWorldUnity = sceneToWorld.ToUnity();
=>
var sceneToWorldUnity = sceneToWorld.Value.ToUnity();
Hernando - Les suggestions de MSFT ont fonctionné pour moi les références ToUnity () manquantes. Le défi d'aligner tous les hologrammes de scène sur le sol demeure, mais c'est un progrès! Merci beaucoup Hernando!
J'ai simplement dû ajouter .value pour accéder aux données de la matrice, puis implémenter cet espace de noms:
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);
}
}
J'ai également essayé de déposer un cube avec un corps rigide et un collisionneur au moment de l'exécution pour déterminer la valeur Y du plancher de données spatiales. Cela semble en fait fonctionner relativement bien, mais ce n'est certainement pas la solution la plus précise.