0

当前我将TangoARScreen脚本附加到Unity中的Tango摄像机预制中,是否可以通过C#脚本检索Unity中的视场值?如何获得Unity中的Tango视场

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

回答

1

这当然是可以的dddddddddaxing。

准备好,这里是你需要做什么:

让我们来看看从C API获取的固有参数托底逻辑的概述。步骤如下:

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

例如,为了获得彩色摄像机内部函数:

TangoCameraIntrinsics ccIntrinsics; 
TangoService_getCameraIntrinsics(TANGO_CAMERA_COLOR, &ccIntrinsics); 

功能填充具有内在的信息结构。

对于C#专门在使用统一这应该是这个样子:

  1. 创建TangoCameraIntrinsics结构对象。
  2. 致电Tango.VideoOverlayProvider类的GetIntrinsics方法。

该方法用固有信息填充结构。

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

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

///参数///说明

///宽度///上像素表示的图像传感器上的图像的宽度。

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

/// 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 *宽度/ FX)

///垂直FOV = 2 * ATAN(0.5 *高度/ Fy)

如果您的渲染引擎仅支持一个FOV值,请参阅其文档以了解要使用哪个FOV。如果需要的视场角,该方程为:

///对角线FOV = 2 *反正切(SQRT((宽度/ 2FX)^ 2 +(高度/ 2FY)^ 2))

相机中的镜头不完美,并添加了一些失真。对于大多数使用情况来说,效果足够小,可以忽略;然而,当Tango设备被校准时,它会检查并存储失真信息,这些值可在TangoCameraIntrinsics结构(C和Unity)中找到。

如果使用运动跟踪相机(有时称为“鱼眼”透镜),则"FOV" distortion model的使用量和TangoCameraIntrinsics结构/对象将包含校准类型TANGO_CALIBRATION_EQUIDISTANT

如果使用彩色摄像机,则polynomial distortion model的使用量和TangoCameraIntrinsics结构/对象将包含校准类型TANGO_CALIBRATION_POLYNOMIAL_3_PARAMETERS

对于一些进一步的深度,看看在VideoOverlayProvider.cs脚本上的Git here

第二QUESTION-

访问前置摄像头会要求你放弃从TangoCore探戈功能和断开服务。您可以通过强制TangoUx包和重新定位来重新启用此中间应用程序,但是您将失去运动跟踪功能,除非您的应用程序正在使用区域学习功能,否则这可能会使最终用户感到困惑。 如果我没有记错,您可以通过TangoMultiCamera Prefab上Inspector中的下拉列表选择此项。

+0

非常感谢您的回答!但是我不太确定C#中的计算,例如垂直FOV,atan会返回-pi/2到pi/2之间的值,而视图的范围是0到pi,如果垂直FOV增加pi/2被映射到正确的范围内? – dddddddaxing