假日好~ 這裡是史密斯
8/9號(六)了,大家昨天有沒有過爸爸節阿~
祝大家週末愉快~
昨天我們已經分別認識了 screen
與 AoV
,但光知道它們是什麼還不夠,今天要把它們連在一起,看看它們在地圖上的互動關係──這是進入 Ray Casting 核心邏輯前的最後一塊拼圖。
screen
與 AoV
的關係嗎?在 Day 6 | Ray Casting 前置 : screen ─ 玩家視野 有提到了 map
與 screen
的關係,
當然還沒有提到AoV
,現在,我們可以把AoV
帶到地圖內來講解了,上圖:
計算機圖學的座標系統會讓我們迷失方向,我們稍回把整個座標系以逆時針旋轉個180度[degree]
一樣,玩家站在 (8, 3)
的位置,
假設從 (16, 7)
到 (0, 7)
都是牆#
這時候玩家方向fPlayerA = 0
,
玩家視野範圍 fAOV = 3.14159 / 4.0f
也就是 45 度[degree]
我們也從類 3-D 的場景來看一下玩家所看到的視野範圍AoV
所對應的畫面 screen
我們進一步地解析玩家的畫面 screen
現在,重新定義玩家畫面 screen
的大小
int nScreenWidth{ 120 };
int nScreenHeight{ 40 };
screen
的寬為 120
, 高為 40
;
我們要完整地顯示 screen
,就要把所有的像素填滿,對吧?
再度提示: 我們是類 3-D 的方式,只能用 2-D 平面角來表示我們能看到的場景
我們以一行一行的方式進行掃描式解析,來填滿screen
直接上圖:screen
寬度為 120
,代表有 120
行(如藍色直線所示)
那怎麼藉由玩家在地圖 map
的相對位置,來填滿玩家畫面 screen
的每一行資訊呢?
是的,就是假設由玩家的眼睛發射光線,直到碰到牆壁為止
小知識: 現實生活當然是光線照射,經過多次照射至人眼接收光線,但由於光的可逆性,我們在遊戲視為光線從玩家發出
光,就是資訊,玩家視野有 120
行, 就從玩家眼睛發出 120
道光吧!
藉由這 120
道光投射至牆壁的資訊,來呈現在玩家畫面 screen
上(當然,我們只能看到牆壁為止,不能透視,對吧? lol)
那麼,在地圖上,我們要解析的 120
道光如圖呈現:
screen
與 AOV
在地圖上的關係screen
上今天我們知道了 screen
與 AOV
的結合方式:screen
的每一行資訊對應 AOV
內的一道光線。
之後我們就要進一步計算這些射線與牆壁的交點,看看 Ray Casting 是如何一步步把 2D 地圖變成類 3D 畫面的!
大家加油~ 一起走下去~