列ごとに壁を立てる
俯瞰で一本だった光線を、画面の横幅ぶん並べる。各列に少しずつ違う角度の光線を割り当て、当たった壁までの距離から縦線の高さを決める。近い壁は高く、遠い壁は低く。床と天井を半分ずつ塗った上に縦線を立てると、平面の地図が目の前の風景になる。
視線方向 dir と、それに直交する投影面 plane を持つ。列 col のカメラ座標 cameraX = 2·col/幅 − 1 を −1..1 に取り、光線方向を dir + plane·cameraX とする。壁の高さは距離に反比例 lineHeight = 画面高 / 距離。ここで使う距離は光線に沿った生の距離でなく、視線方向への射影(垂直距離 perpDist)を使う。生の距離だと画面の端ほど遠くなり、平らな壁が魚眼レンズのように湾曲する。perpDist を使うと、視点から平面までの距離で測る形になり、壁がまっすぐ立つ。DDA の sideDist − delta は、plane 方式で組むとちょうどこの perpDist になる。
固定の視点から、画面の列ごとに DDA で壁を探し、垂直距離で縦線の高さを決める。視線方向はゆっくり左右に振っている。
plane 方式で光線を作り、perp = sideDist − delta を垂直距離として使う。lineH = h / perp の縦線がまっすぐ立ち、壁が湾曲しない。視点を振ると壁の高さがなめらかに伸び縮みする。南北向きの面(side === 1)を少し暗くして、面の向きを区別している。cameraX の作り方を (2·col/cols − 1) から素の角度差に替えると魚眼になり、平らな壁が膨らむ——垂直距離を使う理由がそこで見える。