问题:我一直在尝试基于2D人脸RGB人脸检测在Worldspace创建一个3D位置,类似于此Microsoft示例。我使用Unity2020.3.16f1、MRTK2.8.2和C#来编写统一脚本。我已经能够将链接中显示的C++代码转换为C#,并取得了很大成功。最后一个问题是访问HoloLens 2原点SpatialCoordinateSystem,用于相机的2D坐标系和3D世界空间系统之间的转换。
此链接的SO问题提出了一个非常类似的问题,我尝试使用SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem()作为答案。我在联合的“清醒”方法中调用这个函数,以确保尽早设置它,如下所示。
private void Awake()
{
worldSpatialCoordinateSystem = SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem;
}问题是,当应用程序启动时,如果用户的耳机正在移动,我注意到3D位置中的偏移量与应用程序启动时头部的方向/位置相称。我已经把问题缩小到了这样一个事实,即HL2和Unity在调用“觉醒”中的函数之前设置了一个原点SpatialCoordinateSystem,说明了我所期望的和我所看到的之间的偏移。
我已经尝试过了:,我也尝试过使用其他一些解决方案,列出了这里。我不能使用UnityEngine.Windows.WebCam.PhotoCapture,因为我创建静态图像捕获的方式,而(SpatialCoordinateSystem)Marshal.GetObjectForIUnknown(WorldManager.GetNativeISpatialCoordinateSystemPtr())似乎已经过时,无法使用。最后,我尝试了CreateStationaryFrameOfReferenceAtCurrentLocation(Vector3,四元数),并使用了与当前Camera.main位置和旋转相反的方法,希望补偿偏移量,但它似乎不起作用(NumericsConversionExtensions是统一引擎到系统。数值转换器发现了这里)。密码在下面。
worldSpatialCoordinateSystem = SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation(NumericsConversionExtensions.ToSystem(Camera.main.transform.position*-1),
NumericsConversionExtensions.ToSystem(Quaternion.Inverse(Camera.main.transform.rotation))).CoordinateSystem;,我的问题是:是否有另一种方法来访问原点空间坐标,或者在调用唤醒之前用户正在移动头部时补偿偏移量?
发布于 2022-08-01 00:35:07
我花了3天的时间研究这个解决方案,在问完这个问题后,我发现了一个小时。对于那些来到这里的人,使用下面的代码,最初找到了这里。
using Microsoft.MixedReality.OpenXR;
worldSpatialCoordinateSystem = PerceptionInterop.GetSceneCoordinateSystem(Pose.identity) as SpatialCoordinateSystem;https://stackoverflow.com/questions/73187357
复制相似问题