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

先以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代碼

注意:在開始計(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)不一樣。


在 JavaScript 中,使用反正切函數(shù):
Math.atan2(y, x) // 該函數(shù)接受兩個(gè)參數(shù):對(duì)邊(y)與鄰邊(x)的長度
可以計(jì)算出弧度的值,它的不同之處在于,得出的角度值是從x軸正軸開始以逆時(shí)針方向計(jì)算的。
在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 )

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 );
三、勾股定理
直角三角形中,兩條直角邊的平方和等于斜邊的平方。

A的平方 + B的平方 = C的平方
計(jì)算兩點(diǎn)之間的距離
點(diǎn)1:(x1, y1)
點(diǎn)2:(x2, y2)

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ī)(圖中右上角)
我們就可以應(yīng)用下列函數(shù)來得出要旋轉(zhuǎn)的方向
let angle = atan2(playerVelocity.dy, playerVelocity.dx)
playerSprite.zRotation = angle //(atan2已得出弧度,但此處飛船的指向敵機(jī)的方向是不正確的)

為什么方向(飛船機(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ā)深感自豪