2017-09-12 130 views
1

我目前正在研究增強現實應用程序。目標設備是光學透視HMD,我需要校準其顯示器以實現虛擬對象的正確配準。 我用那個implementation of SPAAM爲android來做到這一點,結果足夠精確,我的目的。視野+屏幕比例+從投影矩陣(HMD OST校準)查看矩陣

我的問題是,校準應用程序輸出給一個4×4 投影矩陣我可以直接與OpenGL的使用爲例。但是,我僅使用接受光學校準參數的Augmented Reality框架,其格式爲 Field of View某些參數+ 長寬比某些參數+ 4x4 查看矩陣。

以下是我有:在錯誤的格式

正確的校準結果:

6.191399, 0.114267, -0.142429, -0.142144 
-0.100027, 11.791289, 0.05604, 0.055928 
0.217304,-0.486923, -0.990243, -0.988265 
0.728104, 0.005347, -0.197072, 0.003122 

你可以看看產生這種結果here代碼。

我的理解是單點主動對準方法生成一個3x4矩陣,然後程序將該矩陣乘以正交投影矩陣以得到上面的結果。下面是用於生產正交矩陣帕拉姆:在正確的格式

near : 0.1, far : 100.0, right : 960, left : 0, top : 540, bottom: 0 

不良校準結果:

Param 1 : 12.465418 
Param 2 : 1.535465 

0.995903, -0.046072, 0.077501, 0.000000 
0.050040, 0.994671, -0.047959, 0.000000 
-0.075318, 0.051640, 0.992901, 0.000000 
114.639359, -14.115030, -24.993097, 1.000000 

我沒有對如何獲得這些結果的任何信息。

我從二進制文件中讀取這些參數,我不知道矩陣是以行還是列主要形式存儲的。所以這兩個矩陣可能必須轉置。

我的問題是:是否有可能,如果是,如何從投影第一矩陣得到這三個參數我有嗎?

+4

投影矩陣的視圖矩陣是不同的東西 - 請參閱[轉換modelMatrix](https://stackoverflow.com/questions/46008171/transform-the-modelmatrix/46008573#46008573)。可能'fov = 2.0 * atan(1.0/prjM [1] [1])* 180.0/PI; aspect = prjM [1] [1]/prj [0] [0]' - 請參閱[如何恢復視圖空間位置給定視圖空間深度值和ndc xy](https://stackoverflow.com/questions/11277501/how -to-recover-view-space-position-given-view-space-depth-value-and-ndc-xy/46118945) – Rabbid76

+0

可以從投影矩陣中獲取該信息,但是您需要知道用什麼公式來構造它。 –

+0

@MrSmith投影矩陣和視圖矩陣是不同的東西,你不能走出投影矩陣的視圖矩陣! – Rabbid76

回答

1

是否有可能,如果是的話,如何從投影矩陣中得到這三個參數?

投影矩陣和視圖矩陣描述了完全不同的變換。雖然投影矩陣描述了從場景的三維點到視口的二維點的映射,但視圖矩陣描述了場景的方向和位置。視圖矩陣由攝像機位置和方向定義爲攝像機的目標視角和向上矢量。
(請參閱Transform the modelMatrix

這意味着無法從投影矩陣中獲取視圖矩陣。但相機定義了一個視圖矩陣。


如果投影是透視,那麼將有可能從投影矩陣得到視場角和縱橫比。

enter image description here

透視投影矩陣是這樣的:

r = right, l = left, b = bottom, t = top, n = near, f = far 

2*n/(r-l)  0    0    0 
0    2*n/(t-b)  0    0 
(r+l)/(r-l) (t+b)/(t-b) -(f+n)/(f-n) -1  
0    0    -2*f*n/(f-n) 0 

它如下:

aspect = w/h 
tanFov = tan(fov_y * 0.5); 

p[0][0] = 2*n/(r-l) = 1.0/(tanFov * aspect) 
p[1][1] = 2*n/(t-b) = 1.0/tanFov 

視角的沿Y軸以度爲單位字段:

fov = 2.0*atan(1.0/prjMatrix[1][1]) * 180.0/PI; 

長寬比:

aspect = prjMatrix[1][1]/prjMatrix[0][0]; 


進一步參看回答下列問題:

+1

感謝您的解釋,我瞭解什麼是投影,視圖和模型矩陣。我編輯了我的問題,以更好地解釋我需要的東西。 – Raoul