567 日目(晴れ)東京都新宿区北新宿の図書館
Calculating the gluPerspective matrix and other OpenGL matrix maths | Unspecified Behaviour の続きを学ぶ。Side view of the camera frustum のイラストに基づいて座標変換を理解する。 ノートが物理的に長くなるので、このページの末尾に記す。
1:25 学習終わり。これで気が済んだ。次はワールド座標系変換?
2:00 Twitter に投稿してあとは就寝時間まで YouTube をチェック。
2:30 就寝。
4:55 いったん目が覚める。毛布の中で考え事をしたり、携帯電話でタイムラインがあまり変わっていない Twitter をチェックしたりして 8:00 前頃にまた眠る。
12:30 起床。PC を起動してコッペパンを二つ食す。 YouTube を聴きながら地図を見たりマニュアルを読んだりする。
14:00 外出。
イトーヨーカドー曳舟店。体温チェック。
スカイツリータウン二階。トイレ。
押上駅。浅草線東日本橋駅で新宿線に乗り換えるつもりが乗り過ごす。まあいい。 大門駅で大江戸線に乗り換える。想定よりも移動時間がかかっている。
中野坂上駅。山手通りを北上して次の交差点を右折したい。 道中、新築中の中野東図書館の存在を確認。さらに東中野図書館の廃館を確認。なんなんだこれは。
通りの名を忘れたが右折。ここから先の経路は初見となる。神田川の小さな橋を超え、間もなく左手に公園が見える。 ここを北に入って少し進むと住民センターのような建物がある。目的地だ。
16:00 新宿区北新宿図書館。新聞雑誌コーナーのベンチが撤収されているので立ち読みさせてもらう。 産経新聞、東京新聞、月刊文藝春秋 2021.12 号をチェック。文藝春秋は後日、時間を取ってまともに読みたい。 近隣住民向けの図書館なのですぐに館内を見終わる。
16:20 退館。大久保方面に歩く。大久保駅西側の交差点を百人町方面に曲がる。 そのままずっと新宿駅まで歩く。京王百貨店および京王線新宿駅の構内を突き進み、いつもの新宿線新宿駅に移動。 改札口から入場して電車に乗る。
小川町駅。中央通り方面に歩く。そのまま秋葉原 HEY 二階へ。ゲームに興じる。
ノスフェラトゥ 2 クレ。コウモリを目の前に発生させる様子はまさにソロモンの鍵。まだ Outer Court から進めない。
イルベロ 3 クレ。イルベロ新作発売までに 100 億突破する目標が潰えた。
ビートマニア 2 クレ。STANDARD モードでレベル 10 曲クリアを三曲増やす。 段位認定モード八段クリア。ラストはまさかのレベル 11 曲か。
退店。20:00 小川町駅。電車で押上駅に戻る。
20:40 ビッグエー墨田業平店。291 円。
- 絹豆腐
- 肉づくし弁当
20:45 曳舟の部屋。さっきから頭痛がするので湯船に湯を張って全身を浸す。 風呂から出て服を着る。PC を起動。晩飯を食う。頭がクラクラする。 写真整理と麻雀の練習。
22:20 インターネットに接続。
- #682 FC版 絵描衛門 デザエモン DEZAEMON BGM ギターメドレー - YouTube: ファミコンしかないと思っていたが、調べると他のゲーム機にもソフトがある。
頭が痛いのでろくなことができない。ブラウザーの開発ツールコンソールで
glMatrix の mat4.perspective の返す行列に適当なベクトルを与えて、
どんな出力になるのかを確認して遊ぶ。
これだけ覚えておけば、スクリーンに平行な平面内では線形補間だから絵が描ける。
ああ、頭痛が治まらない。
座標 ${(y, z)}$ をイラストにおける青三角形の右上の角の目座標系での座標とする。 $z$ は錐体内にある任意の奥行きだと考えていい。このとき次が成り立つ:
\[\tan\frac{\mathrm{fov}_y}{2} = -\frac{y}{z}.\]ここで左辺の逆数を $f$ とおくと
\[y = -\frac{z}{f}.\]この角の座標 $y$ について、NDC 系では $1$ に写像されるべきだ。 同様に、下側の角の $Y_e$ 座標は $-1$ に写像され、 その中間にあるすべての一般的な $y_e$ については線形に写像されるはずだ。 ということは、任意の目座標 ${(y_e, z_e)}$ に対して ${-\dfrac{z}{f} }$ で除算することで、NDC 系 $Y_n$ 座標成分が得られる:
\[y_{n} = -\frac{fy_e}{z_e}.\]$X$ 軸方向ではどうなるか。奥行き $z$ において錐体の上端の右端の目座標系での $X_e$ 座標は ${y \cdot \mathrm{aspect} }$ となる。 きのうの日記に書いた $\mathrm{fov}_x$ と同じ推論により、 任意の目座標 ${(x_e, z_e)}$ に対する NDC 系 $X_n$ 座標成分が得られる:
\[x_n = -\frac{f x_z}{z_e}\cdot\mathrm{aspect}.\]奥行きテストを考えると NDC 系 $Z_n$ 座標成分 $z_n$ も計算する必要がある。 意外なことにわりと自由に決めていいらしいのだが、$z_e$ の逆数に関する一次式で定義するのが自然だ。
\[z_n = \frac{m}{z_e} + c.\]ここで $m$, $c$ は定数とする。${z_e = z_{near}, z_{far} }$ が ${z_n = -1, 1}$ にそれぞれ写像されるから、連立方程式を解いて次を得る:
\[\begin{aligned} c &= -\frac{z_{near} + z_{far} }{z_{near} - z_{far} },\\ m &= -\frac{2 z_{near} z_{far} }{z_{near} - z_{far} }. \end{aligned}\]したがって、
\[z_n = -\frac{2 z_{near} z_{far} }{(z_{near} - z_{far})z_e } -\frac{z_{near} + z_{far} }{z_{near} - z_{far} }.\]以上で $(x_n, y_n, z_n)$ が判明したが、これらを $-1/z_e$ で括ると具合が良い。 その上で $x_c, y_c, z_c, w_c$ を次で定義する:
\[\begin{aligned} -z_e x_c &\coloneqq x_n,\\ -z_e y_c &\coloneqq y_n,\\ -z_e z_c &\coloneqq \frac{z_{near} + z_{far} }{z_{near} - z_{far} }z_e + \frac{2 z_{near} z_{far} }{z_{near} - z_{far}} .\\ w_c &= -z_e. \end{aligned}\]このとき、
\[x_n = \frac{x_c}{w_c},\; y_n = \frac{y_c}{w_c},\; z_n = \frac{z_c}{w_c}.\]定義式から、ベクトル ${(x_e, y_e, z_e, .)}$ をベクトル ${(x_c, y_c, z_c, w_c)}$ に変換する行列の表現も得られる:
\[\def\arraystretch{2.0} \begin{pmatrix} \dfrac{f}{\mathrm{aspect} } & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & \dfrac{z_{near} + z_{far} }{z_{near} - z_{far} } & \dfrac{2 z_{near} z_{far} }{z_{near} - z_{far}}\\ 0 & 0 & -1 & 0 \end{pmatrix}, \;\;f = \cot\frac{\mathrm{fov}_y}{2}.\]この行列が gluPerspective や mat4.perspective が返すものだと考えていい。
この成分を見ると $z_{far} \to \infty$ も OK だろう。むしろ処理が速くなるまである。