allenchou.net
遊戲數學:反三角函數、斜坡角度、與物件面向 | Ming-Lun "Allen" Chou | 周明倫
[latexpage] Here is the original English post本文之英文原文在此 前備教學 三角函數基礎 – 正弦與餘弦三角函數基礎 – 正切、三角形、與砲彈 大綱 我們已經認識了三個基礎三角函數:正弦、餘弦、與正切。現在我們要來看看它們的反函數、以及如何將其利用於遊戲開發。 你將可透過本教學學會: 三個基礎三角函數的反函數如何從給定的斜率算出斜坡的角度 反三角函數的定義域與值域特殊的方便反三角函數atan2如何使物件面相滑鼠游標 反函數 一個函數能被視為一個黑盒子,能夠將給定的輸入值轉換成特定的輸出值。若一個函數$f$能將輸入值$x$轉換為輸出值$y$,我們便將其寫成$y = f(x)$ (唸做y equals f of x)。若一個函數能將$f$的輸出值$y$當作輸入值,而給出$f$的原始輸入值作為輸出值,我們便稱該函數為$f$的反函數,寫成$f^{-1}$ (唸做 f inverse)。 換句話說,若對一個函數$f$輸入$x$而得到$y$ (寫作$y = f(x)$),那麼便可對反函數$f^{-1}$輸入$y$而得到$x$ (寫作$x = f^{-1}(y)$)。 舉例來說,一個將輸入值加一的函數,其反函數為一個將輸入值減一的函數。讓我們將前者寫成$Add1(x)$,然後後者寫成$Sub(1)$。若我們將$x=2$輸入到$Add1(x)$,便可算得: 當我們把$Add1(2)$的輸出值$y=3$反輸入到$Sub(y)$,我們則可得到一開始的$x=2$: 反三角函數 我們已經知道三角函數的輸入值是角的大小,然後其輸出值是個實數。若將三角函數的輸出值作為輸入值餵入它們的反函數,反函數將會輸出原本三角函數輸入的角(單位為弳度)。舉例來說,已知$\sin\frac{\pi}{2} = 1$,於是可得$\sin^{-1}1 = \frac{\pi}{2}$。 反三角函數有特殊的名字。$\sin^{-1}$ (反正弦)不是唸做sine inverse,而是唸做arcsine。同樣地,$cos^{-1}$(反餘弦)和$tan^{-1}$(反正切)分別唸做arccosine和arctangent。於Unity中,呼叫反三角函數的方式如下: 斜坡角度 現在來看個簡單的範例。給定遊戲場景中一斜坡的垂直變量和水平變量,要如何算出斜坡的角度?畫成以下的示意圖,又如何從垂直變量$V$和水平變量$H$算出角度$\theta$? 目標是用$V$和$H$表達$\theta$。首先,我們可用正切函數寫出$\theta$與$V$和$H$之間的關係: 接著,我們便可藉由將$\frac{V}{H}$輸入$\tan^{-1}$來取得$\theta$: 從另一個角度來看,上述等式可以看成是更之前的等式兩邊值各輸入反正切函數的結果。一般來說,$f^{-1}(f(x))$會相消成$x$,而$f(f^{-1}(y))$則會相消成$y$。 $\theta$的單位為弳度。如同先前的教學所提到,可以將其乘上$\frac{180}{\pi}$以把單位轉換為角度。 於是,現在我們可以做個簡單的互動程式,讓使用者移動一個點,該點與原點形成一個斜坡,並且用該點的座標$(X, Y)$計算斜坡的角度。