iT邦幫忙

2025 iThome 鐵人賽

DAY 13
1

大家好,這裡是鐵匠史密斯
8/13 (三) 楊柳颱風來襲,風真的好大,大家注意安全~

驚人發現! 我突破我自己的盲點了!
目前已經把世界地圖、玩家方向的定義都統一了
目前需要大家幫忙把一些定義給修正,以便接下來的推導
是的,今天又是推導課lol (Be patient~ 羅馬不是一天造成的~)

重新定義角度的 正/負

https://ithelp.ithome.com.tw/upload/images/20250813/20157653pI1bO3oh9X.png
我們一開始的定義是最左邊的光線為 -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 };

這樣**世界地圖的角度定義就統一了 **,如下圖:
https://ithelp.ithome.com.tw/upload/images/20250813/20157653tVTA4750L6.png

光如何前進(手寫推論)

  • 有時候想像不出來,紙跟筆真的是你的好夥伴
    昨日已知: 以 0.1 單位遞增 fDistanceToWall
    角度統一了,所以不影響目前的光線單位向量定義,依舊是:
  • 水平分量 x = EyeX
  • 垂直分量 y = EyeX
    隨著一步一步地前進,並以 nTestXnTestY 紀錄
// 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) };

nTestXnTestY 最後要轉成 int 是因為,map 是 1-D 陣列,我們需要用 mapindex(位置) 來看光是否有碰到牆壁 #
如何一步步地前進,並把 TestXTestY 轉成 int
也就是 nTestXnTestY ,直接上圖:
https://ithelp.ithome.com.tw/upload/images/20250813/20157653oTDV2m5asd.png
由上圖可知: 每走 0.1 單位,並轉成 int ,確認光是否到達牆壁
所以,以 fRayAngle = 22.5 [degree] 的光, 再行進 4.4 單位的時候,就可以觸碰到y = 7 上的牆壁, 也就是 (9,7),我們可以用**表格來表示遞增 fDistanceToWall 的結果: **
https://ithelp.ithome.com.tw/upload/images/20250813/201576530PObbe7X3Y.png

今日總結

  • 重新定義 AOV 的方向與角度遞減邏輯,確保世界座標系統一致
  • 光線前進的流程:每走固定距離( 0.1 單位) → 轉整數座標 (nTestX, nTestY) → 檢查是否撞牆
  • 透過圖表驗證 fDistanceToWall 遞增後的碰撞位置

今日算是把之前無法釐清、統一的問題解決了,雖然不曉得會部會影響後面遊戲的功能。
但我想大致的方向還是正確的,有影響的話,也是數值定義的問題
我們繼續走下去~~


上一篇
Day 12 | Ray Casting : 光如何前進? Part 1
下一篇
Day 14 | Ray Casting : 光如何前進? Part 3
系列文
用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言