光線でセルを辿る — DDA
プレイヤーから向いた方角へ光線を一本伸ばし、最初にぶつかる壁を探す。光線を細かい一定刻みで進めると、薄い壁をすり抜けたり無駄に刻んだりする。代わりに、次にセルの縦線か横線のどちらを先に跨ぐかを比べて、跨ぐ境界へ一気に飛ぶ。デジタル微分解析(DDA)。
グリッド DDA は、光線がセル境界を跨ぐ点だけを順に訪ねる。x 方向の次の縦線までの距離 sideDistX と y 方向の次の横線までの距離 sideDistY を持ち、小さいほうへ進んでそのセルに入る。進んだ軸の sideDist に、セル一つぶんの距離 deltaDist = |1 / rayDir| を足して更新する。一格子ずつでなく境界ごとに飛ぶので、訪ねるセル数は光線が横切るセル数ちょうどで無駄がない。Amanatides と Woo が 1987 年に高速なボクセル走査として定式化した。光線がどの面(縦の壁か横の壁か)から入ったかも side として残る。
俯瞰地図の上で、回る光線を一本 DDA で飛ばす。辿ったセルを薄く塗り、壁に当たったセルを濃く、当たった点に丸を打つ。
sideDistX < sideDistY の比較が DDA の中心で、近いほうの境界へ進んでそのセルに入る。進んだ軸の sideDist に delta を足して、その軸の次の境界までを更新する。辿ったセル(薄い帯)が光線の通り道とぴったり重なり、壁に当たったところで止まる。dist = sideDist − delta が当たるまでの距離。光線がほぼ水平・垂直なときも、斜めのときも、跨ぐ境界だけを順に踏むので訪ねるセルが最小限になる。