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