如何使用 Microsoft Scene Understanding SDK 和 hololens2 将 Unity 场景与玩家的物理房间对齐?

How do I use the Microsoft Scene Understanding SDK and hololens2 to align the Unity Scene to the player's physical room?

编辑:这是关闭的,因为它需要更多的细节,但人们一直在投票。所以我会尽力添加一些。这个问题的格式很糟糕,因为它实际上是 2 个问题。 1) 如何从文档中修复此代码? 2) 如何将 unity 场景与玩家的身体对齐 space?

我觉得 #1 专注于答案,但 #2 是标题问题。我的主要问题是正在创建的遮挡网格是 bumpy/not 平坦的,这使得全息图和地板之间的碰撞非常不稳定。我最终创建了一个基本菜单,在玩家面前有一个立方体的全息图。然后指示玩家降低立方体,直到它均匀地坐在地板上。然后我确保所有全息图都不会低于该设定值,无论是使用碰撞平面还是通过代码。希望这个想法可以帮助任何人。谢谢!

当玩家加载到 Hololens2 中的 unity 场景时,Unity 地板平面与物理地板不匹配。使用 hololens2 和 MRTK,Unity 场景原点锁定为玩家头部 0,0,0。

我正在尝试使用 Microsoft Scene Understanding SDK 将 Unity 场景环境 Y 位置设置为物理房间的地板。我目前可以访问地板场景 object,但是当我尝试执行 SpatialCoordinateSystem 部分时,我无法使用 .ToUnity() 方法转换 4x4 矩阵。我不得不将 vector3 .ToUnity() 调用更改为 .ToUnityVector3();但我找不到类似的矩阵方法。

本文档中提到的 .ToUnity() 方法是否已弃用?我是否缺少对某些内容的引用? (参考图片)

我非常感谢这里的任何帮助,无论是在这个特定问题上,还是在将统一场景与 Hololens2 用户的物理环境对齐的整体挑战中。

我正在关注此处提供的信息 https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/scene-understanding-sdk

documentation相比,你少了Value 属性,直接在sceneToWorld对象上调用了ToUnity()方法。这可能是问题的原因。

var sceneToWorldUnity = sceneToWorld.ToUnity();

=>

var sceneToWorldUnity = sceneToWorld.Value.ToUnity();

Hernando - MSFT 的建议对我有用,缺少 ToUnity() 引用。将所有场景全息图与地板对齐的挑战仍然存在,但这是进步!非常感谢赫尔南多!

我基本上只需要添加 .value 来访问矩阵数据,然后实现这个命名空间:

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

我还尝试在 运行 时放下一个带有刚体和对撞机的立方体以确定空间数据层的 Y 值。这实际上似乎工作得比较好,但它绝对不是最精确的解决方案。