2013-11-25 93 views
0

我正在用球體進行射線追蹤。當我們求解二次方程並得到兩個根時,我們需要採取哪個值?我的理解是我們需要最小的價值。但是,當我在計算交點和進一步照明計算時將這個值放在了一起時,我得到了錯誤的結果。當我採取較大的一個,它會給出正確的結果。我在網上看到了一些例子,其中一些正在縮小,另一些正在變大。我真的很困惑哪一個是正確的,爲什麼。帶球體的射線追蹤

回答

0

假設射線的原點爲O,方向爲R(理想情況下爲單位矢量)。然後射線由參數方程O + tR定義。將其分解爲組件Ox + tRx,Oy + tRy和Oz + tRz。將它們代入圓的方程x^2 + y^2 + z^2 = 0。這會產生一個變量t的二次方程。找到方程的根源。

現在,如果你沒有真正的根,射線不會碰到球體。如果你有一個真正的根,那麼你碰到球體的一側。如果你有兩個真正的根,那麼你擊球兩次。你需要更接近的根(更小的t),除非t是負值,在這種情況下,交點在你後面,你不在乎。如果兩個根都是負數,那麼兩個交點都在光線的原點後面,您可以忽略它們。

如果球體從原點轉換而來,並且關心球體的旋轉和縮放,那麼隨着xy,yz,xz,x,y和z項的變化,球體的方程變得更加複雜。一般的二次曲面形狀被定義爲Ax^2 + By^2 + Cy^2 + Dxy + Eyz + Fxz + Gx + Hy + Jz + K = 0。代入參數線方程,求解t,取最小的非負根。

你的交點是O + tR其中t是最小的非負根。從那裏,我不知道爲什麼你的照明計算會關閉。

+0

http://www.codeproject.com/Articles/19732/Simple-Ray-Tracing-in-C 它錯了嗎? – debonair

+0

據我所知,文章是不正確的。採取更大的根會導致你跟蹤球的另一面。我沒有時間去真正調查它,但它對我來說似乎是錯誤的。像這樣的例子有時看起來好像是正確的,但不是。在POVRay中渲染相同的場景並查看它的外觀會很有趣。 –