使用 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 坐标系。
我将 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 坐标系。