學(xué)好三角學(xué)(函數(shù)) — SWIFT和JAVASCRIPT游戲開發(fā)的必備技能 iFIERO.com

不論是使用哪種平臺(tái)進(jìn)行開發(fā),三角學(xué)在游戲當(dāng)中都被廣泛的使用,因此,小編iFERO認(rèn)為,三角學(xué)是必須得掌握的技能之一。

游戲圖片由 摘自 Razeware LLC

先以Javascript為例

一、角度與弧度

最直觀地說,一個(gè) 60度 的角,可以用 60°來表示,也可以用 π / 3 (圓周率除以3)來表示;

同理,一個(gè) 90度 的角,可以用 90°來表示,也可以用 π / 2 (圓周率除以2)來表示;

還有,一個(gè) 180度 的角,可以用 180°來表示,也可以用 π 來表示。

即【60°= π/3】,【90° = π/2】,【180° = π】,等號(hào)的左邊是度數(shù),右邊是弧度。

換句話說,一個(gè)角度,可以用度數(shù)來表示,也可以用弧度來表示。

但因?yàn)?重要的事情說三遍)

弧度更加符合計(jì)算機(jī)的計(jì)算模式,

弧度更加符合計(jì)算機(jī)的計(jì)算模式,

弧度更加符合計(jì)算機(jī)的計(jì)算模式,所以,Math 類的 sin(x)、cos(x)、tan(x) 中的 x 參數(shù)類型為弧度。

那么如何把一個(gè)角度數(shù)轉(zhuǎn)換為弧度值呢?

公式如下:

———————————————-

degrees = radians * 180 / Math.PI // (角度 = 弧度 * 180 / Math.PI)

radians = degrees * Math.PI / 180 // (弧度 = 角度 * Math.PI / 180)

———————————————-

javascript代碼

image

注意:在開始計(jì)算正弦值之前,我們需要將角度值轉(zhuǎn)換為弧度值,然后再進(jìn)行計(jì)算。
正弦值(一個(gè)角的正弦表示與該角相對(duì)的直角邊與斜邊的比例)

var angle = 65;    //假設(shè)角度為65度
var radian = angle * Math.PI / 180;    //計(jì)算出弧度
console.log( Math.sin(radian) );    //輸出sin 65度的值

Math.sin(30 * Math.PI / 180) // ()括號(hào)內(nèi)的作用是將角度值轉(zhuǎn)換為弧度值

二、坐標(biāo)系

javascript中坐標(biāo)系統(tǒng)和標(biāo)準(zhǔn)坐標(biāo)系統(tǒng)不一樣。

image
image

在 JavaScript 中,使用反正切函數(shù):

Math.atan2(y, x) // 該函數(shù)接受兩個(gè)參數(shù):對(duì)邊(y)與鄰邊(x)的長度

可以計(jì)算出弧度的值,它的不同之處在于,得出的角度值是從x軸正軸開始以逆時(shí)針方向計(jì)算的。

image

在javascript或canvas坐標(biāo)系統(tǒng)中,我們所關(guān)注的三角形D的角度為 -153.43° 而不是 26.57°

我們用 Math.atan2(y, x) 計(jì)算A、B、C、D 這4個(gè)三角形的角度:

A:Math.atan2(-1, 2) = -26.57°

B:Math.atan2(1, 2) = 26.57°

C:Math.atan2(1, -2) = 153.43°

D:Math.atan2(-1, -2) = -153.43°

由此我們就可以很方便的分辨出三角形A和C,B和D具體是哪一個(gè)了!

再看一個(gè)實(shí)例:

在javascript坐標(biāo)系中通過反正切(Math.atan2)計(jì)算一個(gè)變化點(diǎn)(mouse.x, mouse.y)對(duì)應(yīng)一個(gè)固定點(diǎn)(arrow.x, arrow.y )的角度:

變化點(diǎn)(mouse.x, mouse.y)

固定點(diǎn)(arrow.x, arrow.y )

image

Math.atan2(y, x) 能正確的計(jì)算出對(duì)應(yīng)角度(注意:Math.atan2已為計(jì)算機(jī)所表達(dá)的弧度了)

var dx = Math.abs(mouse.x - arrow.x)
var dy = Math.abs(mouse.y - arrow.y)
var angle = Math.atan2(dy, dx);
console.log('弧度為:' + angle ); 

三、勾股定理

直角三角形中,兩條直角邊的平方和等于斜邊的平方。

image

A的平方 + B的平方 = C的平方

計(jì)算兩點(diǎn)之間的距離

點(diǎn)1:(x1, y1)

點(diǎn)2:(x2, y2)

三角函數(shù)

var dx = Math.abs(x2 - x1)
var dy =Math.abs(y2 - y1)
var dist = Math.sqrt(dx * dx + dy * dy);
console.log('距離為:' + dist);

數(shù)學(xué)才是最最根本的核心,因此,在用Swift來進(jìn)行游戲開發(fā)時(shí),無非就是調(diào)用XCode的函數(shù)來計(jì)算角度,三角學(xué)的原理還是不變的。

如我們要計(jì)算飛船的旋轉(zhuǎn)方向,讓飛船的機(jī)頭轉(zhuǎn)向敵機(jī)(圖中右上角)

三角函數(shù)
三角函數(shù)

我們就可以應(yīng)用下列函數(shù)來得出要旋轉(zhuǎn)的方向

trigono_3.png

let angle = atan2(playerVelocity.dy, playerVelocity.dx)
playerSprite.zRotation = angle //(atan2已得出弧度,但此處飛船的指向敵機(jī)的方向是不正確的)

RotationDifferences

為什么方向(飛船機(jī)頭的指向敵機(jī)的)會(huì)不正確呢?

因?yàn)椋瑪?shù)學(xué)的角度0°度角是X-Axis軸的正方向,而飛船圖片上的機(jī)頭是往Y軸正方向,所以要修正一個(gè)90度的弧度,用通俗一點(diǎn)的講就是數(shù)學(xué)壓根兒不知到你的飛船圖片上的機(jī)頭方向是朝Y軸還是朝哪個(gè)見鬼的角度,因?yàn)槟憔褪且粡垐D片,所以要修正。

let degreesToRadians = CGFloat.pi / 180 // 方法 degreesToRedians * 一個(gè)角度 就可以成為弧度了。 
let radiansToDegrees = 180 / CGFloat.pi
// 注意要把角度(90)轉(zhuǎn)化為弧度先90 *degreesToRadians
playerSprite.zRotation = angle - 90 *degreesToRadians // 此處得出機(jī)頭正確的旋轉(zhuǎn)方向

總結(jié):掌握三角學(xué)的原理非常重要!如果一遍看不明白,就多看幾遍,多花點(diǎn)時(shí)間,功到自然成!希望iFIERO能幫到你 _~

以上文章由下列二篇文章整理而來,感謝他們的分享:
http://www.cnblogs.com/eyeear/p/5759798.html
https://baijiahao.baidu.com/s?id=1608612160685975801&wfr=spider&for=pc

更多游戲教學(xué):http://www.iFIERO.com -- iFIERO為游戲開發(fā)深感自豪

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容