我寫一個相當非常規的射線追蹤來計算場景中的各種物體的熱傳導性能。在這個射線追蹤器中,隨機射線從我原始物體的表面射入場景中以檢查交叉點。
這個特殊的算法要求每個射線在原始空間中發展,然後仿照源對象仿射變換到世界空間,然後仿射變換回到場景中其他對象的原始空間以檢查相交。
直到我做一個各向異性的比例,例如通過[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個對象之間的輻射熱傳遞。該射線從物體上的隨機點發射,其方向隨機選擇爲位於隨機點的表面法線方向的半球形分佈內。
下面是我的問題的一些可視化。當第一次生成它的射線方向分佈:
如果我使用變換矩陣M應用變換到世界座標:
如果我使用應用變換到世界座標逆變換矩陣M^-1
這句話是很難理解的:「現在這個特定算法要求對原始的空間,然後仿射由源對象變換確定的射線進入世界空間,然後將仿射變換回到場景中其他物體的原始空間以檢查相交。「另外,你能解釋一下爲什麼**你在第二段中做了你所做的事情。這裏還需要更多的解釋和數學來幫助你。 – 2011-04-29 01:57:11
我想這可能會有幫助,如果你將你的算法的陳述編碼成數學公式或代碼,只是爲了清楚乘法順序等。 – Vusak 2011-04-29 01:58:06
另外,請稍等。我沒有看到這與C++直接相關。這聽起來像是一個數學問題。 – 2011-04-29 01:59:46