球體投影到像素空間的大小

1. 概述

需要說明的是,球體投影到像素空間的結果可能不是一個正圓,其半徑或者直徑大小隻能估算而沒有確定的值。根據參考資料,球體投影到像素空間的半徑的計算公式爲:

\[radius_{[clip\_space]} = radius * cot(fov / 2) / Z \tag{0} \]

其中radius是球體的半徑,fov是攝像機視場角,z是球心到攝像機位置的距離。當然,由於最後得到的是裁剪空間的大小,需要換算到屏幕像素空間。

2. 詳論

根據我的理解,這個公式也是近似的。本人通過參考文獻得到的推導方式如下所示。

使用參考文章4中的插圖:

imglink0

球體投影到像素空間的半徑其實就是h的像素長度。此時,有:

\[tan\theta = radius_{[clip\_space]} / z_{[clip\_space]} \tag{1} \]

球體被投影到裁剪空間:
imglink1

由投影變換的性質可知:

\[tan(fovy / 2) = 1 / z_{[clip\_space]} \tag{2} \]

聯立(1)(2)式有,

\[radius_{[clip\_space]} = tan\theta * cot(fovy / 2) \tag{3} \]

根據世界空間的集合關係,有:

\[tan\theta = r / l \tag{4} \]

式(4)帶入式(3)中,有:

\[radius_{[clip\_space]} = r * cot(fovy / 2) / l \tag{5} \]

在攝像機距離球心比較遠的情況下,可以認爲:

\[l \approx d \]

也就是式(0)的由來。如果需要計算準確一點,那麼:

\[l = \sqrt{d^2 - r^2} \tag{6} \]

上式帶入式(5),就會有:

\[radius_{[clip\_space]} = r * cot(fovy / 2) / \sqrt{d^2 - r^2} \tag{7} \]

最後換算到屏幕像素空間:

\[radius_{[screen\_space]} = \frac{r \cdot cot(\frac{fovy}{2}) \cdot height} {2\sqrt{d^2 - r^2}} \tag{8} \]

3. 參考

  1. calculate pixelsize on screen from boundingsphere
  2. Calculating radius of projected sphere
  3. Radius of projected Sphere
  4. Radius of projected sphere in screen space
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章