首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Microsoft场景理解SDK和hololens2将统一场景与玩家的物理空间对齐?

如何使用Microsoft场景理解SDK和hololens2将统一场景与玩家的物理空间对齐?
EN

Stack Overflow用户
提问于 2020-11-20 22:51:37
回答 2查看 656关注 0票数 3

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

我觉得第一题集中在答案上,但第二题是标题问题。我的主要问题是所创建的遮挡网格是颠簸/不平坦的,使得全息图和地板之间的碰撞非常不稳定。最后,我创建了一个基本菜单,在播放器前面有一个立方体的全息图。然后,玩家被指示降低立方体,直到它均匀地坐在地板上。然后,我确保所有全息图都不会低于设定值,无论是通过碰撞平面,还是通过代码。希望这个想法能对任何人有所帮助。谢谢!

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

我试图使用Microsoft场景理解SDK将统一场景环境Y位置设置到物理空间中的地板上。我目前能够访问地板场景对象,但是当我尝试执行SpatialCoordinateSystem部分时,我无法使用.ToUnity()方法来转换4x4矩阵。我不得不将vector3 .ToUnity()调用更改为.ToUnityVector3();但无法为矩阵找到类似的方法。

本文档中提到的.ToUnity()方法是否不受欢迎?我是不是漏掉了什么线索?(参考资料见图片)

我非常感谢这里所提供的任何帮助,无论是在这个特定的问题上,还是在统一场景与Hololens2用户的物理环境保持一致这一总体挑战上。

我正在跟踪这里提供的信息,https://learn.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/scene-understanding-sdk

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-24 15:57:09

赫尔南多-MSFT的建议为我提供了缺失的ToUnity()参考资料。将所有场景全息图对准地面的挑战仍然存在,但这是进步!非常感谢赫尔南多!

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

代码语言:javascript
复制
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值。实际上,这似乎比较好,但它绝对不是最精确的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2020-11-23 07:20:24

文档相比,您忽略了Value属性,直接在sceneToWorld对象上调用了ToUnity()方法。这可能是问题的原因。

代码语言:javascript
复制
var sceneToWorldUnity = sceneToWorld.ToUnity();

=>

代码语言:javascript
复制
var sceneToWorldUnity = sceneToWorld.Value.ToUnity();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64937974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档