大家好,這裡是鐵匠史密斯
8/13 (三) 楊柳颱風來襲,風真的好大,大家注意安全~
驚人發現! 我突破我自己的盲點了!
目前已經把世界地圖、玩家方向的定義都統一了
目前需要大家幫忙把一些定義給修正,以便接下來的推導
是的,今天又是推導課lol (Be patient~ 羅馬不是一天造成的~)
我們一開始的定義是最左邊的光線為 -AOV/2
也就是 -22.5 [degree]
且光線單位向量的
x = EyeX = sin(-22.5) ~ -0.38
y = EyeX = cos(-22.5) ~ 0.924
(-0.38, 0.924)
x
方向向左為正y
方向向上為正所以,如果要讓第一道光以左上方行進,起始的光線角度應該是 AOV/2
, 而不是 -AOV/2
,並且以順時針方向(Clockwise)遞減角度
如同前面所說,方向是由開發者自己定義的,只要定義好一個方向,世界地圖的所有物件都必須遵守這種方向定律
所以,我們需要把 fRayAngle
的初始化數值修改成
// for each column, calculate the projected ray angle into the world space
float fRayAngle{ (fPlayerA + fAOV / 2.0f) - ((float)x / (float)nScreenWidth) * fAOV };
這樣**世界地圖的角度定義就統一了 **,如下圖:
0.1
單位遞增 fDistanceToWall
x = EyeX
y = EyeX
nTestX
、 nTestY
紀錄// because wall's boundaries are at integer coordinates(dot index), so we use intger casting to get the coordinates of the wall
int nTestX{ (int)(fPlayerX + fEyeX * fDistanceToWall) };
int nTestY{ (int)(fPlayerY + fEyeY * fDistanceToWall) };
nTestX
、 nTestY
最後要轉成 int
是因為,map
是 1-D 陣列,我們需要用 map
的 index(位置)
來看光是否有碰到牆壁 #
。
如何一步步地前進,並把 TestX
、 TestY
轉成 int
也就是 nTestX
、nTestY
,直接上圖:
由上圖可知: 每走 0.1
單位,並轉成 int
,確認光是否到達牆壁
所以,以 fRayAngle = 22.5 [degree]
的光, 再行進 4.4
單位的時候,就可以觸碰到y = 7
上的牆壁, 也就是 (9,7)
,我們可以用**表格來表示遞增 fDistanceToWall
的結果: **
AOV
的方向與角度遞減邏輯,確保世界座標系統一致
0.1
單位) → 轉整數座標 (nTestX
, nTestY
) → 檢查是否撞牆fDistanceToWall
遞增後的碰撞位置今日算是把之前無法釐清、統一的問題解決了,雖然不曉得會部會影響後面遊戲的功能。
但我想大致的方向還是正確的,有影響的話,也是數值定義的問題
我們繼續走下去~~