如何访问HoloLens2原点空间坐标系统



问题:我一直在尝试基于2D人脸RGB人脸检测在Worldspace中创建一个3D位置,类似于微软的这个例子。我使用Unity 2020.3.16f1、MRTK 2.8.2和C#作为Unity脚本。我已经能够成功地将链接中显示的C++代码转换为C#。最后一个问题是访问HoloLens 2原点空间坐标系统,该系统将用于相机的2D坐标系和3D世界空间系统之间的变换。

这个链接中的SO问题提出了一个非常相似的问题,我尝试使用SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem()作为答案。我在Unity的";唤醒";方法,以确保尽早设置,如下所示。

private void Awake()
{
worldSpatialCoordinateSystem = SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem;
}

问题是,如果用户的头戴式耳机在应用程序启动时正在移动,我会注意到3D位置中的偏移与应用程序启动时头的方向/位置相当。我已经将问题缩小到这样一个事实,即HL2和Unity在调用Awake中的函数之前设置了一个原点空间坐标系统,解释了我所期望的和我所看到的之间的偏移。

我尝试过的:我也尝试过使用此处列出的其他一些解决方案。我不能使用UnityEngine。Windows。网络摄像头PhotoCapture是因为我创建静态图像捕获的方式,(SpatialCoordinateSystem)Marshal.GetObjectForIUnknown(WorldManager.GetNativeISpatialCoordinateSystemPtr())似乎不推荐使用。最后,我尝试了CreateStationaryFrameOfReferenceAtCurrentLocation(Vector3,Quaternion(,并使用了当前Camera.main位置和旋转的倒数,希望能补偿偏移量,但它似乎不起作用(NumericsConversionExtensions是UnityEngine-to-System.Numerics conserver(。代码在下面。

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;

最新更新