0

目前我将 TangoARScreen 脚本附加到 Unity 中的 Tango 相机预制件中,是否可以通过 C# 脚本在 Unity 中检索视野值?

另外,Unity中是否可以使用前置摄像头?

4

1 回答 1

1

这当然是可能的 ddddddddaxing。

准备好,这是你需要做的:

让我们看一下从 C API 中检索内部参数,以大致了解基础逻辑。步骤是:

  1. 创建一个TangoCameraIntrinsics结构。
  2. 调用TangoService_getCameraIntrinsics函数。将相机的 ID 和结构的地址传递给它。

例如,要获取彩色相机内在函数:

TangoCameraIntrinsics ccIntrinsics;
TangoService_getCameraIntrinsics(TANGO_CAMERA_COLOR, &ccIntrinsics);

该函数使用内在信息填充结构。

对于专门在Unity中使用的 C#,它应该如下所示:

  1. 创建一个TangoCameraIntrinsics结构对象。
  2. 调用类的GetIntrinsics方法Tango.VideoOverlayProvider

该方法用内在信息填充结构。

现在您可以查看使用 Intrinsics 从焦距计算 FOV。

计算 FOV 所需的所有参数都可以从 API 中检索。

/// 参数 /// 说明

/// 宽度 /// 图像传感器上图像的宽度,以像素为单位。

/// 高度 /// 图像传感器上图像的高度,以像素为单位。

/// fx /// 焦距,x 轴,以像素为单位。

/// fy /// 焦距,y 轴,以像素为单位。

请注意,在大多数系统中,fx = fy。

例如,让我们看一下 C 语言:

TangoCameraIntrinsics ccIntrinsics;
TangoService_getCameraIntrinsics(TANGO_CAMERA_COLOR, &ccIntrinsics);

当您检查ccIntrinsics结构时,您应该类似于以下数据:

ccIntrinsics.height=720;
ccIntrinsics.fy=1042.0;

所以:

 Vertical FOV = 2*atan(0.5*720.0/1042.0) = 2*19.0549 deg = 38.1098 deg

水平和垂直视场的方程是:

/// 水平 FOV = 2 * atan(0.5 * width / Fx)

/// 垂直 FOV = 2 * atan(0.5 * height / Fy)

如果您的渲染引擎仅支持一个 FOV 值,请参阅其文档以了解要使用的 FOV。如果您需要对角线视场,则等式为:

/// 对角 FOV = 2 * arctan(sqrt((width/2Fx)^2 + (height/2Fy)^2))

相机中的镜头并不完美,并且会增加一些失真。对于大多数用例,效果小到可以忽略;但是,当 Tango 设备被校准时,它会检查并存储失真信息,并且这些值在TangoCameraIntrinsics结构(C 和 Unity)中可用。

如果您使用的是运动跟踪相机(有时称为“鱼眼镜头”),则使用“FOV”失真模型并且TangoCameraIntrinsics结构/对象将包含校准类型TANGO_CALIBRATION_EQUIDISTANT

如果您使用的是彩色相机,则使用多项式失真模型,并且TangoCameraIntrinsics结构/对象将包含校准类型TANGO_CALIBRATION_POLYNOMIAL_3_PARAMETERS

如需更深入的了解,请在此处查看 Git 上的 VideoOverlayProvider.cs 脚本

第二个问题——

访问前置摄像头将需要您放弃 Tango 功能并断开与TangoCore服务的连接。您可以通过强制打包和重新定位来重新启用此中间应用程序TangoUx,但是您将失去运动跟踪,除非您的应用程序使用区域学习,否则这可能会使最终用户迷失方向。如果我没记错的话,你可以通过TangoMultiCameraPrefab 的 Inspector 中的下拉列表来选择它。

于 2017-05-29T01:54:25.763 回答