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

时间:2017-07-27 10:31:49

标签: android unity3d graphics augmented-reality google-project-tango

我正在使用Unity和Tango,我在获取姿势数据方面遇到了问题。 使用Tango Unity SDK的Unity应用程序是为Android设备构建的,设备获取姿势数据并将其发送到使用OpenGL进行额外处理的计算机。 我的问题是,在哪个坐标系中返回姿势数据,因为我无法使用C API定义引擎? Unity处理像这样的geting姿势数据,并且不能发送任何其他内容:

#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中哪个坐标系是姿势数据,是否有可能以某种方式定义我想要的引擎?

1 个答案:

答案 0 :(得分:0)

我意识到我可以在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类中添加了正确的功能。 现在我得到了在OpenGL项目中正确设置的姿势。

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