數(shù)學(xué)都搞不好,你還搞什么游戲開發(fā)?
前言
數(shù)學(xué)知識,對于游戲開發(fā)來說很重要,可謂是基礎(chǔ)。
今天我們就來說一說游戲開發(fā)中所涉及到的三角函數(shù)與反三角函數(shù)知識。

01 相似三角形
兩個(gè)三角形相似,可以得到一個(gè)結(jié)論,三角形的三個(gè)角度對應(yīng)相等,三個(gè)邊對應(yīng)成比例。

如果有兩個(gè)三角形,有兩個(gè)角是相等的,第三個(gè)角也會相等(三角形內(nèi)角和為180度),這個(gè)這兩個(gè)三角形相似。
02 相似直角三角形
一個(gè)角為直角的三角形,為直角三角形,如果兩個(gè)直角三角形,有一個(gè)除直角以外的角相等,那么這兩個(gè)直角三角形相似。

根據(jù)三角形相似,可以得到 x1/r1 = x2/r2, y1/r1 = y2/r2,x1/x2 = y1/y2,這些比例等式,以及他的變化如:
(x2/x1=y2/y1)
對于一個(gè)直角三角形,如果一個(gè)銳角固定,比如30度,那么這一類三角形都相似,相似三角形邊成比例。所以30度的三角形,對邊/斜邊 y1/r1 值是固定的,鄰邊/斜邊 x1/r1 值是固定的。對邊/鄰邊是固定的值,鄰邊/對邊也是固定的。你只要搞一個(gè)對應(yīng)角度的三角形,就能知道這個(gè)比例值。所以就得到,給一個(gè)角度,就能知道一個(gè)比例。

我們就得到一個(gè)概念,30度的直角三角形,
正弦:對邊/斜邊得到的固定值,稱為sin(30);
余弦:鄰邊/斜邊得到固定的值, 稱為cos(30);
正切:對邊/鄰邊得到的固定值,稱為tan(30);
余切:鄰邊/對邊得到的固定值,稱為ctan(30)。
只要角度不同,根據(jù)這個(gè)角度,就可以得到這個(gè)比例,這個(gè)映射關(guān)系我們叫做三角函數(shù)。
value = sin(角度), value = cos(角度) value = tan(角度) value = ctan(角度)
03 三角函數(shù)推廣
剛才我們分析的是直角三角形里面的一個(gè)比例函數(shù),根據(jù)相似三角形推導(dǎo)而來。
給定一個(gè)直角三角形的銳角,他的各種比例關(guān)系就是確定的,形成了一個(gè)角度與比例值的一些列函數(shù),我們統(tǒng)稱三角函數(shù)。
因?yàn)橹苯侨切沃?,只能是銳角,我們接下來把三角函數(shù)推廣。
先看一個(gè)坐標(biāo)系,已知一個(gè)點(diǎn)的坐標(biāo)為(x, y), 已知原點(diǎn)為(0, 0), 坐標(biāo)距離原點(diǎn)的距離為len
原點(diǎn)到點(diǎn)(x, y)的向量與x軸的角度為r;

正弦:sin(角度) = y/len;余弦cos(角度)=x/len;正切:tan(角度) = y/x, ctan(角度)= x/y。
這樣推廣的好處,不只是直角三角形,直角三角形只能是銳角,這樣推廣到了任意角度。

image
04 反三角函數(shù)
既然角度可以得到比例,那么比例也可以得到角度,這個(gè)是反三角函數(shù)。
根據(jù)上面的推斷,已知(x,y)點(diǎn)的坐標(biāo),就可以獲得角度。這個(gè)叫做反三角函數(shù),一般編程語言的數(shù)學(xué)庫都提供了,Math.atan2(y,x)
第一個(gè)參數(shù)填y坐標(biāo),第二個(gè)填x坐標(biāo)。這樣已知一個(gè)點(diǎn)(向量)即可求的角度。我們計(jì)算角色朝向的時(shí)候經(jīng)常需要用到這個(gè)函數(shù)。

但有一個(gè)要注意,Math.atan2返回的角度是弧度。
05 弧度與角度
一個(gè)長度,可以用米來表示,也可以用厘米來表示,米和厘米只是這個(gè)長度的一個(gè)度量單位。
一個(gè)重量, 可以用斤表示,也可以用倆表示。斤與倆只是重量的一個(gè)度量單位。
一個(gè)角度,可以用度與弧度來表示。一個(gè)圓周, 度為360度,弧度為2*PI。180度為PI弧度。
這樣就得到了弧度與度的轉(zhuǎn)換,

度轉(zhuǎn)弧度,有幾個(gè)180,就有幾個(gè)PI弧度。例如degree角度轉(zhuǎn)弧度r
r = (degree /180) * PI
弧度轉(zhuǎn)度,有幾個(gè)PI,就有幾個(gè)180度
degree = (r / PI) * 180
06
習(xí)題練習(xí)
a: 遙感的向量(x, y), 如何求角色的朝向角度?
r = Math.atan(y, x)
b: 遙感的向量為(x, y), 速度大小為speed, 如何做矢量分解?
vx =speed * x / len;
vy =speed * y / len;
len 為(x, y) 到(0, 0)的長度。

最后
本期的技術(shù)文章就是這些,請大家多多分享,多多點(diǎn)贊。
基礎(chǔ)知識始終是最重要的,這些通過游戲大廠的招聘就可以看出。
希望大家不要一味貪圖“更高級的技術(shù)”,而是夯實(shí)基礎(chǔ),才能在游戲開發(fā)中無往不勝。
我是Blake老師,祝大家成功。