问题:我一直在尝试基于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;