使用 Google Tango with Unity 获取 OpenGL 坐标系的姿势数据

Getting pose data for OpenGL Coordinate System using Google Tango with Unity

我将 Unity 与 Tango 结合使用,但在获取姿势数据时遇到问题。 使用 Tango Unity SDK 的 Unity 应用程序是为 Android 设备构建的,设备获取姿势数据并将其发送到使用 OpenGL 完成额外处理的计算机。 我的问题是,由于我无法像 C API 那样定义引擎,因此返回的是哪个坐标系的位姿数据? Unity 会像这样处理获取姿势数据,并且不会发送任何其他信息:

#if UNITY_EDITOR
        GetEmulatedPoseAtTime(poseData, timeStamp, framePair);
#else // ANDROID
        int returnValue = API.TangoService_getPoseAtTime(timeStamp, framePair, poseData);
        if (returnValue != Common.ErrorType.TANGO_SUCCESS)
        {
            Debug.Log(CLASS_NAME + ".GetPoseAtTime() Could not get pose at time : " + timeStamp);
        }
 #endif

为了证明我的 OpenGL 应用程序可以正常工作,我使用 C API 以相同的想法创建了 Tango 项目(获取姿势数据并发送它):

    TangoCoordinateFramePair pair;
    pair.base = TANGO_COORDINATE_FRAME_START_OF_SERVICE;
    pair.target = TANGO_COORDINATE_FRAME_DEVICE;

    base = TANGO_SUPPORT_ENGINE_OPENGL;
    target = TANGO_SUPPORT_ENGINE_OPENGL;

    error = TangoSupport_getPoseAtTime(poseTimestamp, pair.base, pair.target, base, target, ROTATION_0, &pose);

...这有效。

我认为数据可能在 Tango 坐标系中,我尝试将具有 C# 等效函数的姿势数据转换为 QuatTangoToGl 和 Vec3GlToTango 形式 here,但仍然不正确。

那么,Unity SDK 中的姿势数据在哪个坐标系中,是否可以以某种方式定义我想要的引擎?

我意识到我可以在 TangoSupport 中公开函数 TangoSupport_getPoseAtTime 并添加枚举 EngineType 和 RotationType(值与 C API 匹配)。

所以,我在 TangoSupportAPI 下的 TangoSupport.cs 中添加了这个:

[DllImport(TANGO_SUPPORT_UNITY_DLL)]
public static extern int TangoSupport_getPoseAtTime(
            double timestamp, TangoEnums.TangoCoordinateFrameType baseFrame, TangoEnums.TangoCoordinateFrameType targetFrame,
            Common.EngineType baseEngine, Common.EngineType targetEngine, Common.RotationType rotation, [In, Out] TangoPoseData pose);

并在 TangoSupport class 中添加了适当的功能。 现在我得到了在 OpenGL 项目中正确设置的姿势。

没有定义引擎类型,给定的 poseData 用于 Tango 坐标系。