2009-11-09 58 views
0

我正在寫一個光線跟蹤器(使用左手座標,如果這有所作爲)。這是爲了教我自己的原則,所以我沒有使用OpenGL或複雜的功能,如景深(還)。我的相機可以有任意的位置和方向;我通過三個載體location,look_atsky表示它們,其行爲與equivalent POV-Ray vectors相似。其「電影」也有widthheight。 (focal長度隱含的距離從positionlook_at。)如何投射任意相機的光線?

我的問題是,不知道如何投射射線。我有兩個數量,vxvy,指示射線應該在哪裏結束。它們都從-1到1變化。如果它們都是-1,我會將光線從相機的位置投射到「電影」的左上角;如果他們都是1,則右下角;如果他們都是0,那麼這個中心;其餘顯而易見。

我對使用矢量算法推導射線方程式不夠熟悉。我希望能解釋如何這樣做。

回答

1

你已經描述了什麼需要做得相當好。您的視野取決於您的相機與您要投射光線的「電影」之間的距離。相機距離電影越遠,視野越窄。

想象一下電影是相機指向的位圖圖像。假設我們將相機放置在距離位圖一個單位之外。然後,我們必須通過每個位圖的像素投射光線。

這個矢量非常簡單。如果我們將相機位置設置爲(0,0,0),並且位於其前面的位圖膠片的中心位於(0,0,1),則右下角的光線是 - tada - (1, 1,1),左下角的是(-1,1,1)。

這意味着右下角和左下角之間的差異是(2,0,0)。

假設你的水平位圖的分辨率應該是1000,那麼你可以通過底線像素迭代如下:

width = 1000; 
cameraToBottomLeft = (-1,1,1); 
bottomLeftToBottomRight = (2,0,0); 

for (x = 0; x < width; x++) { 
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight; 
    ... 
} 

如果是十分明顯的,那麼你只需要添加一個相當於外環爲你的線條,和你擁有了所有你需要的光線。

然後,您可以爲相機到膠片的距離以及水平和垂直分辨率添加適當的變量。完成之後,您可以開始通過矩陣變換來改變外觀矢量和向上矢量。

如果你想圍繞計算機圖形學打包頭,introductory textbook可能會有很大的幫助。我在大學時使用了this one,我想我喜歡它。

+0

謝謝,我現在就開始工作。 – Remy 2009-11-15 22:58:50