[英]How to access the HoloLens2 Origin SpatialCoordinateSystem
问题:我一直在尝试基于 2D 人脸 RGB 人脸检测在 Worldspace 中创建 3D position,类似于此 Microsoft 示例。 我将 Unity 2020.3.16f1、MRTK 2.8.2 和 C# 用于 Unity 脚本。 我已经能够成功地将链接中显示的 C++ 代码转换为 C#。 最后一个问题是访问 HoloLens 2 原点 SpatialCoordinateSystem 以用于相机的 2D 坐标系和 3D 世界空间系统之间的转换。
此链接上的 SO question 提出了一个非常相似的问题,我已尝试使用SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem()
作为答案建议。 我在Unity的“Awake”方法中称这个function,以保证尽早设置,如下图。
private void Awake()
{
worldSpatialCoordinateSystem = SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem;
}
问题是,如果用户的耳机在应用程序启动时移动,我注意到 3D 位置的偏移与应用程序启动时头部的方向/位置相称。 我已将问题缩小到一个事实,即 HL2 和 Unity 在调用 Awake 中的 function 之前设置了一个原点 SpatialCoordinateSystem,这说明了我所期望的和我所看到的之间的偏移。
我尝试过的:我也尝试过使用此处列出的其他一些解决方案。 我无法使用 UnityEngine.Windows.WebCam.PhotoCapture 因为我创建静态图像捕获的方式,并且(SpatialCoordinateSystem)Marshal.GetObjectForIUnknown(WorldManager.GetNativeISpatialCoordinateSystemPtr())
似乎已被弃用且无法使用。 最后,我尝试了CreateStationaryFrameOfReferenceAtCurrentLocation(Vector3, Quaternion) ,并使用了当前 Camera.main position 和旋转的倒数,希望能够补偿偏移量,但它似乎不起作用(NumericsConversionExtensions 是 UnityEngine-to-System.Numerics转换在这里找到)。 该代码如下。
worldSpatialCoordinateSystem = SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation(NumericsConversionExtensions.ToSystem(Camera.main.transform.position*-1),
NumericsConversionExtensions.ToSystem(Quaternion.Inverse(Camera.main.transform.rotation))).CoordinateSystem;
我的问题:当用户在调用 Awake 之前移动头部时,是否有其他方法可以访问原点空间坐标或可能补偿偏移量?
我花了 3 天时间研究解决方案,并在询问 SO 1 小时后找到了一个。 对于那些来这里的人,请使用下面的代码。
using Microsoft.MixedReality.OpenXR;
worldSpatialCoordinateSystem = PerceptionInterop.GetSceneCoordinateSystem(Pose.identity) as SpatialCoordinateSystem;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.