使用HoloLens 2获取空间坐标系统的正确方法

3
我正在尝试理解通过MediaFrameReference类获取帧的转换。所得到的是一张带有关联空间坐标系和内在相机参数的图像。 为了计算图像中一个像素(U,V)的真实世界坐标(X,Y,Z),我认为只需访问代表从RGB相机到世界的变换矩阵的4x4矩阵即可。
为此,我找到了TryGetTransformTo(SpatialCoordinateSystem target)方法。如果我正确理解文档,那么我应该调用该方法来获取与图像相关联的图像坐标系。

image.CoordinateSystem.TryGetTransformTo(worldCoordinateSystem)


  • 但我无法找到正确的方法来获取worldCoordinateSystem。 显然可定位相机文档中的一部分已经被删除了。

  • 我查看了微软的示例(HolographicFaceTracking),但我很难解释c++代码。所以对我来说并不是很有用。

  • HoloLens的草图实验中,程序员使用了 var unityWorldCoordinateSystem = Marshal.GetObjectForIUnknown(WorldManager.GetNativeISpatialCoordinateSystemPtr()) as SpatialCoordinateSystem;,但它被声明为过时。 使用这些信息和极好的谷歌搜索技巧,我找到了这个链接。 有一个类似的问题从未得到回答。

我有一个问题,即获取我所需的空间坐标系统的最有效方法是什么。 我正在使用Unity 2018.4.22f1和Visual Studio 2019。
非常感谢任何帮助。顺祝商祺。
1个回答

3
建议使用PhotoCapture类来拍摄照片,PhotoCaptureFrame.TryGetCameraToWorldMatrix方法可以轻松获取由相机到世界矩阵填充的Matrix4x4,该矩阵记录了拍摄照片时相机的位置和角度。您可以参考这个链接来学习如何使用它:UnityEngine.Windows.WebCam.PhotoCapture
当您调用异步方法TakePhotoAsync(onCapturedPhotoToMemoryCallback)时,请遵循指南并传入一个函数作为参数,该函数将在照片存储到内存后被调用。在这个函数中,您将得到一个PhotoCaputrerFrame实例作为参数。最后,在此参数上调用PhotoCaptureFrame.TryGetCameraToWorldMatrix以获取由相机到世界矩阵填充的矩阵,该矩阵记录了拍摄照片时相机的位置和角度。
此外,早期的MR文档演示了如何使用着色器代码在摄像头图像上查找或绘制特定的3D位置,您可以在GitHub提交历史记录中找到它:mixed-reality-docs/locatable-camera.md

非常感谢提供的信息。我会继续查看最后一个链接,但不幸的是它对我来说不适用。 我想继续使用MediaFrameReference类,因为我稍后想要处理与时间相关的深度数据。 有没有可能使用这个类获取4x4矩阵? - man_with_finite_freetime
刚刚了解到静态参考框架部分,在应用程序启动时存在一个静态参考框架。我该如何访问它?使用附带的坐标系来进行编程是否可行?还是应该使用SpatialLocator类并使用CreateStationaryFrameOfReferenceAtCurrentLocation()方法生成自己的参考框架? 抱歉,我在这个领域非常新。 - man_with_finite_freetime
3
通常在Unity开发中,我们使用Unity提供的坐标系。你可以参考以下代码来获取它:(SpatialCoordinateSystem)Marshal.GetObjectForIUnknown(WorldManager.GetNativeISpatialCoordinateSystemPtr())。但是,如果您不想使用UnityEngine.XR.WSA API,因为它已被标记为过时,可以使用"SpatialLocator"作为替代方案。您可以使用SpatialLocator.GetDefault().CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem()来创建一个坐标系,其中原点位于设备位置上启动应用程序时的位置。 - Hernando - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接