iT邦幫忙

2025 iThome 鐵人賽

DAY 9
1
自我挑戰組

用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting系列 第 9

Day 9 | Ray Casting : 玩家畫面 screen 以及 視野範圍 AoV 的關係

  • 分享至 

  • xImage
  •  

假日好~ 這裡是史密斯
8/9號(六)了,大家昨天有沒有過爸爸節阿~
祝大家週末愉快~

昨天我們已經分別認識了 screenAoV,但光知道它們是什麼還不夠,今天要把它們連在一起,看看它們在地圖上的互動關係──這是進入 Ray Casting 核心邏輯前的最後一塊拼圖。

還記得 screenAoV的關係嗎?

Day 6 | Ray Casting 前置 : screen ─ 玩家視野 有提到了 mapscreen的關係,
當然還沒有提到AoV,現在,我們可以把AoV帶到地圖內來講解了,上圖:
https://ithelp.ithome.com.tw/upload/images/20250809/20157653tPUq5HAWLR.png
計算機圖學的座標系統會讓我們迷失方向,我們稍回把整個座標系以逆時針旋轉個180度[degree]
一樣,玩家站在 (8, 3) 的位置,
假設從 (16, 7)(0, 7) 都是牆#
這時候玩家方向fPlayerA = 0
玩家視野範圍 fAOV = 3.14159 / 4.0f 也就是 45 度[degree]
我們也從類 3-D 的場景來看一下玩家所看到的視野範圍AoV所對應的畫面 screen
https://ithelp.ithome.com.tw/upload/images/20250809/20157653GxSL7JVGfM.png

screen 寬度多少,我們就可以射出多少光線

我們進一步地解析玩家的畫面 screen
現在,重新定義玩家畫面 screen的大小

int nScreenWidth{ 120 };
int nScreenHeight{ 40 };

screen 的寬為 120 , 高為 40
我們要完整地顯示 screen ,就要把所有的像素填滿,對吧?
再度提示: 我們是類 3-D 的方式,只能用 2-D 平面角來表示我們能看到的場景
我們以一行一行的方式進行掃描式解析,來填滿screen
直接上圖:
https://ithelp.ithome.com.tw/upload/images/20250809/20157653gAj0Z5GIzd.png
screen寬度為 120,代表有 120 行(如藍色直線所示)
那怎麼藉由玩家在地圖 map 的相對位置,來填滿玩家畫面 screen 的每一行資訊呢?
是的,就是假設由玩家的眼睛發射光線,直到碰到牆壁為止

小知識: 現實生活當然是光線照射,經過多次照射至人眼接收光線,但由於光的可逆性,我們在遊戲視為光線從玩家發出

光,就是資訊,玩家視野有 120 行, 就從玩家眼睛發出 120 道光吧!
https://ithelp.ithome.com.tw/upload/images/20250809/20157653rbntdvtTIj.png

藉由這 120 道光投射至牆壁的資訊,來呈現在玩家畫面 screen 上(當然,我們只能看到牆壁為止,不能透視,對吧? lol)
那麼,在地圖上,我們要解析的 120 道光如圖呈現:
https://ithelp.ithome.com.tw/upload/images/20250809/20157653BmdWGc6ewi.png

今日總結

  • screenAOV 在地圖上的關係
  • 玩家如何接收光的資訊,並呈現在 screen

今天我們知道了 screenAOV 的結合方式:screen 的每一行資訊對應 AOV 內的一道光線。
之後我們就要進一步計算這些射線與牆壁的交點,看看 Ray Casting 是如何一步步把 2D 地圖變成類 3D 畫面的!

大家加油~ 一起走下去~


上一篇
Day 8 | Ray Casting 前置 : fPlayerA ─ 如何改變玩家方向
下一篇
Day 10 | Ray Casting 前置階段回顧 ─ 從地圖到玩家視野的基礎鋪墊
系列文
用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言