4

所有,3D仿射變換問題,在光線追蹤

我寫一個相當非常規的射線追蹤來計算場景中的各種物體的熱傳導性能。在這個射線追蹤器中,隨機射線從我原始物體的表面射入場景中以檢查交叉點。

這個特殊的算法要求每個射線在原始空間中發展,然後仿照源對象仿射變換到世界空間,然後仿射變換回到場景中其他對象的原始空間以檢查相交。

直到我做一個各向異性的比例,例如通過[2 2 1](各向同性的比例很好)來縮放對象,所有的都是好的。這導致我相信我沒有正確地改變射線的方向分量。目前,我通過將方向分量乘以源對象逆變換矩陣的轉置將射線方向從原始空間轉換到世界空間,然後通過乘以目標對象轉換的轉置將射線從世界空間轉換到每個基本空間矩陣。

我也試過乘以源基元的變換矩陣從原始到世界空間並乘以目的地逆變換從世界空間到原始空間但這是不成功的。

我相信從原始物體表面(隨機點和隨機方向)發射的射線應該按照與「常規」射線追蹤中的表面法線相同的方式進行變換,但我不確定。

那裏的任何專家都知道我的方法有什麼缺陷?隨時詢問是否需要更多信息。


的基本算法爲這個光線追蹤如下:

For each object, i, in scene 
{ 
    for each ray, r, in number of rays per object 
    { 
     determine random ray from primitive i 
     convert ray from primitive space of i to world space 

     for each object, j, in scene 
     { 
      convert ray to primitive space of object j 
      check for intersection with object j 
     } 
    } 
} 

希望清理的問題讓我們來看一個例子。假設我有一個沿着z軸(單位半徑和高度)延伸的圓柱體和一個位於xy平面內的內徑爲7和外徑爲8的環。我希望x和y的圓柱體的刻度乘以係數6方向(而不是z方向),所以我的仿射變換矩陣如下:

M(cylinder) = |2 0 0 0|  M^-1(cylinder) = | .5 0. 0. 0. | 
       |0 2 0 0|       | 0. .5 0. 0. | 
       |0 0 1 0|       | 0. 0. 1. 0. | 
       |0 0 0 1|       | 0. 0. 0. 1. | 

M(annulus) = |1 0 0 0|  M^-1(annulus) = |1 0 0 0| 
       |0 1 0 0|       |0 1 0 0| 
       |0 0 1 0|       |0 0 1 0| 
       |0 0 0 1|       |0 0 0 1| 

現在假設我有具有缸體S上的表面和一個隨機方向上的隨機起始點遠離的光線圓柱體c的表面給出射線r(os)= s + ct。

我想將這條光線從原始(物體)空間轉換到世界空間,然後測試與場景(圓環)中其他物體的相交。

第一個問題是使用M(柱面)或M^-1(柱面)將射線r(os)轉換到世界空間r(ws)的正確方法是什麼。

第二個問題是什麼是正確的方法然後將射線r(ws)從世界空間轉換到對象空間以檢查與其他對象的交集,使用M(環形)和M^-1(環形) )。


一些額外的背景信息:

本申請是用於計算N個對象之間的輻射熱傳遞。該射線從物體上的隨機點發射,其方向隨機選擇爲位於隨機點的表面法線方向的半球形分佈內。


下面是我的問題的一些可視化。當第一次生成它的射線方向分佈: Initial ray directional distribution

如果我使用變換矩陣M應用變換到世界座標: Direction transformed by M

如果我使用應用變換到世界座標逆變換矩陣M^-1 Direction transformed by M^-1

+0

這句話是很難理解的:「現在這個特定算法要求對原始的空間,然後仿射由源對象變換確定的射線進入世界空間,然後將仿射變換回到場景中其他物體的原始空間以檢查相交。「另外,你能解釋一下爲什麼**你在第二段中做了你所做的事情。這裏還需要更多的解釋和數學來幫助你。 – 2011-04-29 01:57:11

+0

我想這可能會有幫助,如果你將你的算法的陳述編碼成數學公式或代碼,只是爲了清楚乘法順序等。 – Vusak 2011-04-29 01:58:06

+0

另外,請稍等。我沒有看到這與C++直接相關。這聽起來像是一個數學問題。 – 2011-04-29 01:59:46

回答

1

這只是想出了前些天在This question

一個答案鏈接到一個光線追蹤新聞文章討論使用逆的轉置變換法線。

我不得不同意JCooper詢問「究竟是怎麼回事?」。我的第一個想法是,你似乎是模擬輻射傳熱,你必須小心將不均勻的物體縮放。如果在發射的物體表面上有一個「光子」的均勻分佈,然後應用該物體的非均勻縮放,則會出現離開該表面的光子不均勻分佈。這是一個可能的陷阱,但由於您沒有指出發生了什麼問題,所以很難說這是否是您的問題。

要獲得關於正確的方式做轉換問題,請按照This link to Ray Tracing News

+0

phkahler,你是非常正確的我正在模擬輻射傳熱,我的問題是在各向異性縮放之後,我的'光子'的均勻分佈變得不均勻。因此,本質上我需要知道如何從對象空間轉換到世界空間,從世界空間轉換到對象空間以保持均勻分佈。 – cubiclewar 2011-04-29 23:19:01

+0

如果您將均勻分佈的點放在立方體的表面上,然後將其垂直拉伸2倍,則頂部和底部上的點不會改變密度,而邊則會得到一半的密度。球體上存在同樣的問題。我確信有解決方案,但我認爲這不是轉化本身的問題。 – phkahler 2011-05-19 20:20:07

3

逆轉置變換矩陣保持旋轉分量恆定,但反轉縮放。這意味着縮放比例仍然存在。這對於法線是正確的:考慮在2d中從(0,0)(.707,.707)的線段。正常的是(-.707,.707)。如果我們按(s,1)進行縮放,則我們得到從(0,0)(s * .707,.707)的分段。在極限情況下,由於s變大,我們基本上有一條平行於x軸的平直線。這意味着法線應該指向y軸。所以我們得到一個正常的(-.707/s,.707)。然而,從這個例子中應該清楚,轉化的載體不再是單位長度。也許你需要規範化方向組件?

如果我們首先使用一個變換矩陣可以表示爲夾在兩個旋轉之間的比例(a SVD)的屬性,我們可以得到您的出站轉換矩陣看起來像這樣:R2out * Sout^-1 * R1out,然後你的入站轉換矩陣看起來像這樣:R1in^-1 * Sin * R2in^-1(我希望如何使用Mathjax ...)。這似乎是正確的,只要你重新規範你的向量。


編輯:

這個一夜的思考,我決定,反置的事情可能只有效法線情況。考慮上面的例子。如果s = 2,則線段的斜率最初爲,變爲1/2。同樣,正常的斜率從-1變成-2。線段和射線之間仍有90度角。到現在爲止還挺好。現在......如果所考慮的矢量實際上與線段平行,該怎麼辦?我們得到一個斜率爲,不再平行。

所以,我想我在這一點上有兩個問題。什麼是錯誤在你的程序/什麼讓你覺得它不正確? 正確的行爲是什麼?也許你可以製作一個二維圖。

+0

我不確定我是按照您的術語進行出站和入站轉換。我已經看過規範化方向向量。我所說的信息說,如果你正常化比你的交叉點時間(t)將是錯誤的。 – cubiclewar 2011-04-29 04:07:48

+0

我同意JCooper,可能會在某處引入非線性。如果你正在附加多個轉換,順序很重要(即我認爲我說得很對,你可能想先縮放,然後旋轉,然後轉換爲位置)。如果你希望你可以使用我的光線跟蹤代碼作爲參考,你可以創建柱面,轉換和檢查光線交點,只需在python shell中編寫幾行代碼https://github.com/danieljfarrell/pvtrace讓我知道如果你需要指導。 – 2011-04-29 10:46:02

+0

在我正在運行的情況下,我只能進行縮放或縮放和轉換(按該順序),所以順序不應該成爲問題。我不確定將在何處引入非線性。 – cubiclewar 2011-04-29 14:01:15