如何使用 Tango 和 Unity 从屏幕 space 获取深度点

How to get a depth point from screen space using Tango and Unity

我想使用 Unity Tango 集成中的点云在视口中心的世界 space 中找到一个点。然后我会在那里放置一个 "reticle" 类型的游戏对象。

我的代码基于 C API examples 中的 point_to_point 示例。

TangoSupport_getDepthAtPointNearestNeighbor 是可以满足我需要的功能,但它需要一个姿势参数。

C API 表示是:

The pose of the point cloud relative to the color camera used to obtain uv_coordinates.

Unity API 说这是:

Transformation matrix of the color camera with respect to the Unity World frame.

point_to_point 示例调用:

TangoSupport_calculateRelativePose(
  color_image_timestamp, TANGO_COORDINATE_FRAME_CAMERA_COLOR,
  point_cloud->timestamp, TANGO_COORDINATE_FRAME_CAMERA_DEPTH,
  &pose_color_camera_T_depth_camera);

找到姿势。

但这在 Unity 集成中不存在。我试过像这样手动添加它:

internal const string TANGO_SUPPORT_UNITY_DLL = "tango_support_api";
[DllImport(TANGO_SUPPORT_UNITY_DLL)]
private static extern int TangoSupport_calculateRelativePose(
    double base_timestamp, TangoEnums.TangoCoordinateFrameType base_frame,
    double target_timestamp, TangoEnums.TangoCoordinateFrameType target_frame,
    out TangoPoseData base_frame_T_target_frame);

并这样称呼它:

TangoPoseData poseData = new TangoPosedata();

TangoSupport_calculateRelativePose(
    pointCloudData.m_timestamp,
    TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_CAMERA_COLOR,
    pointCloudData.m_timestamp,
    TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_CAMERA_DEPTH,
    out poseData
);

但是当我调用它时,这给了我一个空引用。我采取的方法正确吗? TangoSupport_calculateRelativePose 是否存在于 Unity 集成附带的 tango_support_api 库中?

Unity 包中有一个 point_to_point 示例。但是使用 C# 函数 FindClosestPoint,它只是遍历点云中的每个点,这不是一个可用的解决方案。

目前,FindClosestPoint 无法通过 Unity 使用。最接近的替代是 PointCloud 预制件中的 FindPlane 函数。见函数 here.