大家好~ 這裡是鐵匠史密斯
昨日我們已經完成了牆壁的渲染
接下來,我們就直接完成角色的前進與後退吧
fPlayerA
前陣子,我們使用 Q
、 E
按鍵完成視角的轉動,也就是改變 fPlayerA
的值fPlayerA
決定了玩家的方向,玩家的前進、後退、轉動的動作都由該變數決定
還記得下面這張圖嗎?
我們在探討 fAOV
中每一道光線時,可以知道每一道光線的角度 fRayAngle
光線的角度,也代表了**光線的方向,也就是單位向量,其: **
x = fEyeX = sinf(fRayAngle)
y = fEyeY = cosf(fRayAngle)
既然我們可以求出光線的單位向量,那玩家方向的單位向量也是可以以同樣的概念來計算,
上圖:
在計算機圖學的座標系中,我們假設玩家向逆時針轉動了 30 [degree]
,可以得知:
玩家的單位向量中:
x = sinf(fPlayerA)
y = cosf(fPlayerA)
+x
、 +y
前進x = -sinf(fPlayerA)
y = -cosf(fPlayerA)
-x
、 -y
,也就是單位向量的反方向後退x' = x + △x
,我們就可以改變玩家的位置了:if (GetAsyncKeyState((unsigned short)'W') & 0x8000)
fPlayerX += sinf(fPlayerA) * fElaspedTime * 5;
fPlayerY += cosf(fPlayerA) * fElaspedTime * 5;
if (GetAsyncKeyState((unsigned short)'S') & 0x8000)
fPlayerX -= sinf(fPlayerA) * fElaspedTime * 5;
fPlayerY -= cosf(fPlayerA) * fElaspedTime * 5;
與轉動玩家方向的概念相同,都是使用 GetAsyncKeyState()
幫我們完成偵測按鍵的功能,
前進/後退是使用 W
/S
來進行操控,
當然,也可以在後面乘上常數 5
,來使玩家的移動速度加快(依需求調整)~
這樣的話,就可以使玩家前進/後退啦~
fPlayerA
玩家的方向來決定W
/S
進行前進/後退的動作到這裡,我們的角色已經可以「原地轉頭」+「向前走」+「往後退」了,
明日周末來第二次總結一下吧~ 鐵人賽快要完成了~
但是這個專案還會一直優化下去,
一起走下去~