天天看點

AnglesToConfigAngleToConfig

AngleToConfig

該文章英文位址,翻譯中有一些個人添加的輔助資訊,以括号辨別,以粗體表示,例如(以下為個人翻譯,水準有限,歡迎指正).

AnglesToConfig的源代碼可以在distortionizer代碼倉庫裡找到.這個程式擷取從視角到實體螢幕位置的映射關系,然後生成一個osvr server 的配置檔案,以及将要被渲染到的規則螢幕的描述,最終對顯示進行反畸變,

這個程式的背後操作原理可以見這裡

步驟1:确定角度到螢幕的映射

生成一個帶有條目的空格分割檔案,每行有四個條目,檔案中不包含标題.這四列條目表示:

(1)從向前注視的方向上看水準的角度(角度的正方向向右),機關為度.

(2)從向前注視的方向上看垂直的角度(角度的正方向向上),機關為度.

(3)螢幕上向前注視的點的距離,向右為正,機關為米(或則通過指令行參數指定為毫米).

(4)螢幕上向前注視的點的距離,向上為正,機關為米(或則通過指令行參數指定為毫米).

示例檔案的前幾行如下:

- - - -
- - - -
- - - -
- - - -
           

上面所說的”向前注視的方向”是從眼睛向前的方向,就像眼睛注視前方無限遠的物體.”向前注視的點”是在向前注視方向上看時,在眼睛中央凹的中心處(這個凹處是眼睛視網膜上的一個位置)看到的顯示屏的位置.除非螢幕的邊緣通過指令行參數指定,程式将使用檔案中指定的X和Y值範圍來确定螢幕尺寸和螢幕内前視點的位置.

注意:指定螢幕坐标和螢幕邊界的空間不一定是毫米或米,但是它們必須使用相同的機關.它們被标準化,以便找到相對于指令行參數指定的螢幕邊角的檔案内坐标所對應的位置.如果沒有使用指令行參數來指定,那麼中間中的任何一緻的間距(像素,米,毫米)都是可以的.因為指令行參數假設與螢幕中的值是相同的(都是以米為機關),是以使用像素坐标所需的全部參數是在檔案中指定這些參數,并将其指定為-screen參數,并且不在指令行參數指定”-mm”選項.檔案和指令行參數的值需要在同一個空間中定義(這在技術上來說是對程式進行欺騙,告訴他機關都是米,但是鎮規劃能夠解決這個問題).(個人感覺這裡意思是:總之這些坐标的機關要統一,最省事的是全部指定為米)

注意:這些角度是指視野角度,不同于緯度/經度.每個标定值是從原點傾斜到通過指定店的平面的夾角.經度點是指YZ平面向X軸傾斜角度(正方向是指X軸的正方向),緯度點是指XZ平面向Y軸傾斜角度(正方向指向Y軸的正方向).程式的早起版本使用經/緯球面坐标來确定點,這會導緻在垂直方向上産生額外的畸變.

注意:紅色,綠色和藍色可以有一個單獨的檔案,來進行色散畸變矯正.或則單獨使用一個檔案來對所有顔色進行相同的畸變矯正.

步驟2:計算非機構性畸變網格和規則螢幕

AnglesToConfig讀取未排序的映射表,這個映射表是指從角度到實體顯示屏上的位置的映射,并生成一個畸變映射和規則螢幕描述資訊寫入到配置檔案中,供osvr server使用.這個程式作為一個過濾器,從标準輸入中讀取表格,寫入到最終輸出的JSON格式的配置檔案當中.它可以不帶任何指令行參數運作,也可以帶一些可選的參數:

  • –screen screen_left_meters screen_bottom_meters screen_right_meters screen_top_meters:允許你指定螢幕的實際邊界,以防在實際邊界上沒有記錄點.這些參數指定四個值,機關為米:相對于前向注視點的螢幕的左,下,上,右四個角.預設情況下是通過找到檔案中X和Y最大/最小值來判斷的(比如左下角是,X,Y最小值,左上角是,X最小值,Y最大值……).
  • -mm:指定檔案中螢幕位置條目的機關為毫米.-screen參數指定的機關仍然為米.預設為米.
  • -eye right|left:指定哪一個眼睛,參數是left或right.預設是right.
  • -depth_meters D:指定螢幕焦點深度.焦點距離越大,可以減少IPD變化帶來的影響.注意,畸變依賴于IPD.預設值為2米.
  • -latlong:指定的角度是經度和緯度,而不是視野角度.預設值是視野角度.
  • -verify_angles xx xy yx yy max_degrees:測試每一個網格點,當轉換到螢幕空間時,確定在角度空間裡相鄰的兩個點的矢量之間不超過max_degree.轉換規定:螢幕上的矢量(xx,xy)點的經度正方向是右(原文是左,後來跟這個項目的作者确認确實是寫錯了,已經送出和修改,見issue 26),螢幕上的矢量(yx,yy)點的緯度正方向是上.
  • -mono infile:指定一個檔案名作為标準輸入,生成單色畸變功能的配置檔案.
  • -rgb redfile greedfile bluefile:需要三個檔案名參數,每個參數為紅色,綠色和藍色.

OSVR HDK 1.3例子:基于OSVR HDK1.3版本的透鏡上,不同眼睛位置下生成的一系列單色的模拟值.你可以在這裡找到這些參數表.右眼對應顯示屏的X軸的範圍從-32到28.48,Y軸的範圍是-34.02到34.02,機關毫米.注意:在這種情況下模拟區域沿着鼻子方向穿過螢幕的邊緣.當程式運作時,要生成網格中之外的點的時候會提示警告,并列印出來.Note:在模拟環境中的不符合規範的點是需要剔除的,我們需要使用-verify_angles 選項來移除他們.支援這個檔案的指令行是:

AnglesToConfig -mm -screen - -   -mono _mm_Eye_Relief_trimmed.txt -verify_angles      > HDK13_11mm_client.json
           

OSVR HDK 變種例子:如果有一個HMD使用與HDK1.3一樣的透鏡.它的螢幕是72mm高,64.8mm寬.鏡頭與鼻子的距離是2.2mm.右眼對應顯示屏X軸的範圍是-30.2到34.6,Y軸對應的範圍是從-36到36,機關毫米.這裡的透鏡偏移與HDK1.3設計的偏移方向相反.對于這種情況,我們可以重新運作上面HDK1.3的例子,修改一下不同的參數,内容如下:

AnglesToConfig -mm -screen - -   –mono _mm_Eye_Relief_trimmed.txt -verify_angles      > HDKvar_11mm_client.json
           

RGB示例:一個圓形顯示上做一個模拟運作,生成三個原色輸出檔案,右眼顯示X軸從-40到75度,Y軸從-65到65度.不同顔色對應的範圍以毫米為機關,X軸上範圍為-27.3到73.3,Y軸為-33.4到33.4.這意味着被模拟覆寫的螢幕的X軸的尺寸比實際螢幕尺寸小.實際的螢幕尺寸在X軸上為120.96mm,Y軸為68.04mm.注意:在這種情況下,模拟區域在鼻子方向上穿過螢幕邊緣.當這個程式運作時生成網格範圍之外的點時,将列印出警告資訊.Y軸區域在向前注視點的方向上是對稱的,螢幕範圍從-34.02到34.02毫米.向前注視點的X位置在從螢幕左邊開始的25.34mm的位置.這意味着螢幕的左邊緣實際上是-25.34mm,有邊沿是95.62mm(120.96-25.34).支援這個檔案的指令是(這裡将會産生一個警告資訊):

步驟3:建構配置檔案

主配置檔案:AnglesToConfig列印出一個Json格式的檔案,它是所有配置檔案中的一個子集,這些配置檔案會被發送到osvr server裡,以支援正确的渲染内容顯示在顯示屏上.

應該基于步驟2中生成的out.json檔案中的資訊來修改示例檔案的幾個部分.field_of_view和eyes部分應該修改他們的資料為比對的資料(新的部分可以指派粘貼到這個檔案中,覆寫哪些部分).

畸變校正:從OSVR0.6版本開始,配置檔案的大小收到網絡傳輸單元大小的限制.是以檔案的畸變部分不能夠直接指派到主配置檔案中.而是将它儲存在out.json檔案(它可以被重命名或移動),主配置檔案需要修改節點來指向它.如果檔案被移動到”C:/OSVR/Distrotion_client.json”,那麼一下部分将描述在用戶端上:

"distortion": {
    "type": "mono_point_samples",
    "mono_point_samples_external_file": "C:/OSVR/Distortion_client.json"
},
           

對于RGB配置檔案,如下:

"distortion": {
    "type": "rgb_point_samples",
    "rgb_point_samples_external_file": "C:/OSVR/Distortion_client.json"
},
           

這些可以複制-粘貼到主配置檔案當中.

定位顯示:顯示配置的分辨率字段的寬和高,需要與顯示的橫屏模式相比對,通常是1920x1080.

實際顯示屏的方向确定了在主配置檔案中的renderManagerConfig部分的display字段裡的rotation域的值(renderManager.direct.portrait.json檔案—display—rotation).如果顯示屏是橫屏模式,則設定為0.如果是豎屏模式(這種方式掃描某些顯示器的速度較快),則該值設定為90.

在配置檔案中,renderManagerConfig部分的window字段裡的xPosition和yPosition域來描述屏在MicrosoftWindows顯示布局中的位置.預設檔案設定了顯示屏的左上角位置(即X軸偏移1920的地方,這個1920是主顯示器的X軸分辨率).右側顯示屏的左上角則位于左側顯示屏的右端(是1920還是1080,要根據rotation的值).在Windows裡的顯示位置需要按照這種方式來配置.

步驟4:運作程式來使用這些配置檔案

用于畸變矯正的配置檔案,可以拷貝到例如C:/OSVR的檔案夾裡,并且編輯主配置檔案裡的相應字段,來使用這個配置檔案,”osvr server”運作如下指令行參數:

osvr_server.exe C:/OSVR/Distortion_server.json
           

任何一個基于RenderManager的OSVR用戶端程式都可以運作,它将從server上擷取到配置資訊,從不endif的Distortion_client.json檔案讀取畸變矯正資訊.