06 橢圓拋物面上的光線反射探討
旋轉拋物面的多次反射示意圖
從旋轉拋物面的光學性質不難得知,不論是接收訊號的拋物面天線、蝶式聚熱太陽能的聚光盤、手電筒的聚光杯等等,所使用的形狀,都是旋轉拋物面。 因為只要進入旋轉拋物面的光線/訊號平行對稱軸,都會聚集到旋轉拋物面的焦點;而從拋物面的焦點發出去的光線/訊號,也都會平行對稱軸向外射出。[br][br]那麼,如果使用橢圓拋物面的話,這些平行射向橢圓拋物面的光線,會發生什麼事情呢?[br]那就先來看看橢圓拋物面的特性。
若用一個與對稱軸垂直的平面,切過橢圓拋物面,截痕即是一個橢圓;若用一個包含對稱軸的平面,切過橢圓拋物面,其截痕仍是拋物線,但會因為切的角度不同而截出開口大小也不相同的拋物線,當然,它們的焦點也都不在同個位置。[br][br]
在之前的作品4之中,為了做出法線,我們使用了一個方法:[br]對旋轉拋物面[i]z[/i]=[i]a(x[/i][sup]2[/sup]+[i]y[/i][sup]2[/sup]) ,過拋物面上P點的法線,可使用以下指令製作:[br] Line( P , ( 0 , 0 , [i]z[/i](P) + 1/(2[i]a[/i]) )[br][br]由於旋轉拋物面所截出的拋物線,其開口大小都一樣;但是,橢圓拋物面的截出的拋物線,其大小都不相同,這也代表各個拋物線所使用的係數[i]a[/i]都是不同的。[br]那麼,只要我們能夠每次都推算出當時拋物線的係數[i]a[/i]之值,上次製作拋物面法線的技巧,仍舊可以使用。[br][br]
側視橢圓拋物面
參考上圖[br]B為橢圓拋物面上一點,圖中藍色拋物線,即B點所在的截痕拋物線。[br][i]h[/i]為B點到底部平面([math]xy[/math]平面)的距離,[i]d[/i]則是B點到對稱軸([math]z[/math]軸)的距離。[br][br]若B=([math]x,y,z[/math]),則[i]h[/i]=[math]z[/math] , [i]d[/i]=[math]\sqrt{x^2+y^2}[/math][br]將其代入到常用的二次函數形式,來推得係數[i]a[/i][br][i]h[/i]=[i]ad[/i][math]^2[/math] => [i]a[/i] = [math]\frac{h}{d^2}=\frac{z}{x^2+y^2}[/math][br][br]那麼,對於一個在橢圓拋物面上的P點,其法線就可寫成[br]Line( P , ( 0 , 0 , [math]z\left(P\right)+\frac{x\left(P\right)^2+y\left(P\right)^2}{2z\left(P\right)}[/math])[br][br]既然有了法線,那模擬光線反射就不是問題了。[br][br]不過在此處,我們想要討論的,是光線平行對稱軸,射向橢圓拋物面的情形,[br]所以只需要做一次~兩次反射即可。
(1) 在"檢視"之中操作,開啟3D繪圖區。[br] 這次因為需要數值滑桿,所以主繪圖區不要關閉,但是可以將主繪圖區的格線與座標軸隱藏。[br][br](2) 製作數值滑桿b,用於調控橢圓拋物面的形狀。[br]名稱:b 類型:數值 最小:3 最大:5 增量:0.1[br][br](3) 製作數值滑桿r,用於調控光源起點的位置。[br]名稱:r 類型:數值 最小:-9 最大:9 增量:0.2[br][br](2) 製作數值滑桿θ,用於調控光源起點的位置。[br]名稱:θ 類型:角度 最小:0° 最大:360° 增量:1°
(1) 輸入指令:A = rotate( (r,0,10) , θ , z軸 ) 。[br] .這樣A點就是一個在半徑為r、圓心為(0,0,9)的水平面圓上的點了。[br] .操作數值滑桿r,θ就能調整A點位置。[br][br](2) 在指令列輸入指令:z =x^2 / 25 + y^2 / b^2[br] .確認一下拋物面的名稱是否為f,以下以拋物面名稱為f為例去操作[br] ,當b=5時,f即是旋轉拋物面[br][br](4) 製造當光線從A平行對稱軸往下射時,光線在拋物面上的反射點B。[br] 輸入指令 B = Intersect(f, Ray(A, A+(0,0,-1) ) )[br][br](5) 製作向量AB,作為光線的示意。[br][br]PS: 用方程式製作的曲面,會是無限延伸的,有的時候可能會遮蔽視線。這時候就可以靠參數曲面,來製作一個有邊界的曲面來模擬了。[br]輸入指令 S = Surface(5k cos(θ), b*k sin(θ), k², k, 0, 4, θ, 0, 2π)[br]接著再將原本的拋物面f隱藏。[br]但注意,參數曲面無法用來製作交點或切線等等,所以指令輸入時,仍要使用原本的拋物面方程式f 。
使用參數曲面指令Surface製作的橢圓拋物面
在B點上的法線為 Line( B , ( 0 , 0 , z(B) + (x(B)^2+y(B)^2 )/( 2*z(B) ) ) ) ,[br]但法線是用來幫我們找出對稱點,也就是光線的走向。這裡我們就不再製造出法線。[br][br](1) 做點A對「B的法線」之對稱點A',[br]輸入指令A' = Reflect( A , IF(z(B)!=0 , Line( B , ( 0 , 0 , z(B) + (x(B)^2+y(B)^2 )/( 2*z(B) ) ) ) , z軸)) 。[br][br]這裡這樣設定,是因為當A在z軸上時,第一個反射點B會變成(0,0,0),那上述的法線的寫法,就會出現分母為0的作物情形。而當B = (0,0,0)時,不難想像,其法線就是z軸。[br][br](2) 做出射線r1,輸入指令 r1 = Ray( 0.99*B+0.01*A' , A' )。[br](3) 做出射線r1與拋物線f的交點,C = intersect( r1,f )。[br](4) 製作向量BC,作為光線的示意。
(1) 利用前一個反射點,做點B對「C的法線」的對稱點B',[br]輸入指令Reflect( B , Line( C , ( 0 , 0 , z(C) + (x(C)^2+y(C)^2 )/( 2*z(C) ) ) ) )。[br][br]此處不做像上一步驟那麼複雜的設定,是因為我們現在考量的情形,是光線一開始就平行對稱軸往下射。而在這種情況下,只有第一次反射時的反射點,有機會變成(0,0,0)。[br][br](2) 做出射線r2,輸入指令 r2 = Ray( 0.99*C+0.01*B' , B' )。[br][br]因為光源是平行對稱軸射向拋物面,所以最多只會有兩次的反射。[br]這次的反射光線,就不會再碰到拋物面了。
(1) 當起始光源A到B之間會通過焦點時(A在z軸上,B為(0,0,0) ),光線反射一次後會遠離拋物線,所以要讓射線r1顯示。[br]將射線r1的[b]顯示條件[/b]設定為「 z(B) == 0 」,同時製造向量BA',讓射線r1看起來更有方向感,並使該向量的[b]顯示條件[/b]亦設為「 z(B) == 0 」。[br][br](2) 當起始光源A到B之間沒有通過焦點時,光線反射兩次後會遠離拋物線,所以要讓射線r2顯示,用來表示射向無限遠處的光線。[br]這裡不需多做設定,讓r2顯示就好。當B=(0,0,0)時,射線r2就會因為下一個反射點C不存在,所以r2也會跟著不存在。[br]但為了讓射線r2顯示時更具有方向性,這裡就要製造向量CB'[br][br](3) 隱藏不必要出現的對稱點。
(1) 製作射線r1和z軸的交點,輸入 F = Intersect( r1 , z軸 )[br](2) 製作向量BF,來強調光線與對稱軸的交點。
(1) 當你固定θ時,改變r的數值,你可以觀察到A點會在一線段上移動。此時光線與對稱軸(z軸)的交點固定不變。[br][br](2) 當你改變θ的數值時,光線與對稱軸(z軸)的交點會不斷變動,但是固定在一個線段內。