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