如何使用 Microsoft 场景理解 SDK 和 hololens2 将 Unity 场景与玩家的物理房间对齐? [关闭]

Posted

技术标签:

【中文标题】如何使用 Microsoft 场景理解 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? [closed] 【发布时间】:2021-03-04 08:54:35 【问题描述】:

编辑:这是关闭的,因为它需要更多细节,但人们一直在支持它。所以我会尽力补充一些。这个问题的格式很差,因为它实际上是 2 个问题。 1)如何从文档中修复此代码? 2) 如何将统一场景与玩家的物理空间对齐?

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

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

我正在尝试使用 Microsoft 场景理解 SDK 将 Unity 场景环境 Y 位置设置为物理房间的地板。我目前能够访问地板场景对象,但是当我尝试执行 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

【问题讨论】:

请不要发布代码/错误/数据的图像。而是将代码/错误/数据作为文本发布在代码块中。见How do I ask a good question? 感谢您的意见。祝你有美好的一天。 【参考方案1】:

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

var sceneToWorldUnity = sceneToWorld.ToUnity();

=>

var sceneToWorldUnity = sceneToWorld.Value.ToUnity();

【讨论】:

非常感谢您的帮助!我试过了,但我仍然无法调用 ToUnity() 请查看我对帖子的编辑。 我注意到您的using 指令列表不包括NumericsConversionExtensions 类,看来您没有将这个助手类添加到项目中。实际上,根据文档,你应该首先添加这个帮助类来在这两个约定之间进行转换,你可以使用以下代码:Converting between coordinate systems。 这成功了!非常感谢!【参考方案2】:

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

我基本上只需要添加 .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 值。这实际上似乎工作得比较好,但它绝对不是最精确的解决方案。

【讨论】:

以上是关于如何使用 Microsoft 场景理解 SDK 和 hololens2 将 Unity 场景与玩家的物理房间对齐? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

全息透​​镜 2 |微软 - 有没有人让场景理解实时工作?

如何修复不匹配的 Azure 管道 yaml asp.net sdk 版本

如何在 Corona SDK 中切换到另一个场景?

Microsoft Speech SDK开发包 使用

将印地语或卡纳达语用于 microsoft speech sdk [关闭]

Lync SDK (Microsoft.Lync.Model)