Just My Life & My Work

直線與球體的關係

高中數學的三維空間概念在計算機圖學派上用場了!

第一次的作業part1要做眼睛、平面、球體的關係,

從眼睛一點(a0,b0,c0)到平面的一點(a1,b1,c1)為一條線,

看這條線是否能夠「打」到球體中心(x0,y0,z0)半徑r。

上頭參數為已知,關係如下:

sphere: (x-x0)^2+(y-y0)^2+(z-z0)^2=r^2

ray: (x,y,z)=(a0,b0,c0)+(a1-a0,b1-b0,c1-c0)*t

剩下t為未知參數,

只要將t算出來,就可知有沒有打中!

其中t為一值者,切到球體,

t為兩值者,穿過球體,

t為無值者,沒有碰到球體。

# expand sphere equation:
(x^2-2x*x0+x0^2)+(y^2-2y*y0+y0^2)+(z^2-2z*z0+z0^2)=r^2
# substitute x for ray equation:
x^2 =(a0+(a1-a0)t)^2
=a0^2+2a0(a1-a0)t+(a1*t-a0*t)^2
=a0^2+2a0*a1*t-2a0^2*t+a1^2*t^2-2a1*a0*t^2+a0^2*t^2
-2x*x0 =-2×0(a0+(a1-a0)t)
=-2a0*x0-2a1*x0*t+2a0*x0*t
x0^2
# y & z the same as above
# sort equation:
at^2+bt+c=0
a =a1^2-2a1*a0+a0^2
+b1^2-2b1*b0+b0^2
+c1^2-2c1*c0+c0^2
=(a1-a0)^2+(b1-b0)^2+(c1-c0)^2
b =2a0*a1-2a0^2 – 2a1*x0+2a0*x0
+2b0*b1-2b0^2 – 2b1*y0+2b0*y0
+2c0*c1-2c0^2 – 2c1*z0+2c0*z0
=2[a0(a1-a0)+x0(a0-a1)+b0(b1-b0)+y0(b0-b1)+c0(c1-c0)+z0(c0-c1)]
=2[(a0-x0)(a1-a0)+(b0-y0)(b1-b0)+(c0-z0)(c1-c0)]
c =a0^2-2a0*x0
+b0^2-2b0*y0
+c0^2-2c0*z0
+x0^2+y0^2+z0^2
-r^2
=(a0-x0)^2+(b0-y0)^2+(c0-z0)^2-r^2
t=(-b+-(b^2-4ac)^(0.5))/2a

接下來就放多顆球來玩玩看效果,

看在平面上的圓會不會變形。

若要來打平面也可用方程式來解喔!

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲