我正在寫一個光線跟蹤器(主要是爲了好玩),雖然我已經寫了一個過去,並花了大量的時間搜索,沒有教程似乎闡明瞭如何在透視投影中計算眼睛光線,而不使用矩陣。Raytracer - 計算的眼睛光線
我相信我最後一次做的是通過使用類Quaternion
(可能)低效旋轉相機方向矢量的眼矢量x/y
度。這是用C++編寫的,我正在用C#做這個,儘管這並不重要。
僞代碼(假設V * Q =變換操作)
yDiv = fovy/height
xDiv = fovx/width
for x = 0 to width
for y = 0 to height
xAng = (x/2 - width) * xDiv
yAng = (y/2 - height) * yDiv
Q1 = up vector, xAng
Q2 = camera right vector, yAng
Q3 = mult(Q1, Q2)
pixelRay = transform(Q3, camera direction)
raytrace pixelRay
next
next
我認爲與此實際的問題是,它模擬球形屏幕表面,而不是平坦的屏幕表面。
請注意,雖然我知道如何以及爲什麼要使用交叉產品,點積,矩陣等,但我真正的3D數學問題解決技能並不是很棒。
所以給出:
- 攝像機位置,方向和上矢量
- 視場
- 屏幕像素和/或子採樣劃分
什麼是實際的方法爲光線跟蹤器的x/y像素座標產生一個眼睛光線?
爲了澄清:我正是我想要計算的,我只是不太想拿出3D數學來計算它,並且我發現沒有光線跟蹤代碼似乎有我需要的代碼計算單個像素的眼睛光線。
謝謝。對不起,我應該在這個問題上讓自己更清楚。我的腦海裏實際上已經有了這種實現。如果用一個視場角來計算屏幕距離,那麼如果x是-0.5到0.5,縱橫比不能承受? – 2011-05-10 02:08:28
考慮當你改變'screen_distance'(焦距)時會發生什麼。隨着您移近它,圖像變得更加寬廣。因此,我們假設我們希望以度爲單位的視角「FoV」。如果考慮右邊中間的最大y值,它將形成一個三角形,意味着tan(FoV/2)= 800/screen_distance'。因此,如果我們設置'FoV'而不是'screen_distance',我們將'screen_distance'設置爲'800/tan(FoV/2)'。當然,人們不會使用像2560和1600這樣的固定值,但是你去了。 – ninjagecko 2011-05-10 02:14:48