YouTube で昭和歌謡曲をつまみ食いしながら学習時間を過ごす。 Tutorial 17 : Rotations のチートシートを glMatrix に対応しておく。

難度 課題 コメント
How do I know if two quaternions are similar? quat.equals(q1, q2)
How do I apply a rotation to a point? vecN.transformQuat(out, v, q)
How do I interpolate between 2 quaternions? quat.slerp(out, q1, q2, t)
How do I cumulate 2 rotations? quat.mul(out, q1, q2)
How do I find the rotation between 2 vectors? quat.rotationTo(out, v1, v2)
★★ I need an equivalent of gluLookAt. How do I orient an object towards a point? mat4.targetTo?
★★ How do I use LookAt, but limit the rotation at a certain speed? quat.slerp のようなものを書く

quat.equals については特筆することはない。 vecN.transformQuatvecNvec3 または vec4 とする。 quat.slerp は何しろ球面補間なので、出力を入力から想像するのは至難だ。 quat.mul は四元数の乗算そのものであり、この代数が三次元空間内の回転処理を記述するのに有用だというのが基本だ。

quat.rotationTo は与えられた二ベクトルが直線上にない場合を議論する。 アルゴリズムは次のようなものになる。入力がどちらも単位ベクトルであることを事前条件とする:

function rotationTo(out, v1, v2){
    const cosTheta = vec3.dot(v1, v2);

    // verify cosTheta...

    // out: rotation axis
    vec3.cross(out, v1, v2);
    out[3] = 1 + cosTheta;
    return quat.normalize(out, out);
}

mat4.targetTo は上記文書のアルゴリズム RotationBetweenVectors と同じ結果を生じるか? これを時間を取って試したい。その次の RotateTowards 問題もだ。

最後に、quat.conjugate の結果を確認すると納得できるが、内部的には quat オブジェクトの第三成分が実部を表す。

1:25 学習時間終了。YouTube に逃げる。

2:05 寝る。

7:05 起床。納豆とピザパンを食す。出勤。

7:45 現場。当集合住宅専用ゴミ置き場に明らかによそ者のゴミ袋が十袋近く置いてある。スペースに余裕がないので困る。 中身を検めると投棄者の住所が書かれている封筒が複数ある。近所のようだ。 とりあえず通常業務を途中まで進める。ゴミ搬出が終わったところで、先ほどの不法投棄物の犯人の住居を地図で調べる。 本当に近所だ。こちらで処分しかねる資源ゴミだけを袋に詰め替えて家の前に置き返す。証拠品を保存しておく。

あとは館内清掃などをして時間をつぶす。掃除機があると明らかにきれいになる。

10:10 撤収。

10:20 ビッグエー墨田京島店。312 円。

  • おむすび梅おかか
  • 小粒納豆 (3)
  • 絹豆腐
  • シーフードヌードル
  • メロンパン

イトーヨーカドー曳舟店。体温チェックとトイレ。

コンビニ。芹沢のハゲ。専門的なラーメンの議論をしているなと思ったら、芹沢にしてみれば酒場談義レベルなのか。

曳舟の部屋。洗濯機を回しつつ室内と玄関前を清掃。まだ掃除するのか。室内はともかく、玄関周りが汚い。 新品が大量に着荷してダブついていることもあり、現場から古くなった洗剤を持ち帰ったほうがよかったか。 雑巾が一つしかないのも心もとない。現場には大量にある。何か歯車があわない。

11:35 洗濯物を干す。室内の掃き漏らしたゴミを養生テープで除去。

PC を起動。この時刻ではインターネットをひととおりチェックしたらもうおやつになるだろう。

12:00 おやつ。

13:15 昼寝。おそらく呼び鈴で目を覚ますだろう。しかし早めに目が覚めてしまう。 毛布にくるまって待つ。

15:10 呼び鈴が鳴る。福祉事務所 I 氏来訪。約束の時刻の 20 分前とはなんと礼儀正しい。 こちらとしては立ち話でも中に入っても問題ないように用意したかったが、 部屋の奥が汚いのをごまかしきれないので玄関で立ち話する。 仕事がなかなか見つからないのを咎められないように話の流れを逸らすことに注力する。 意外な変化球として、歯医者に予約を入れるように要望を出される。 個人的には歯医者は好きなので行きたい。しかし、保険証がないので予約を入れにくい。

15:40 家庭訪問終了。生活費を頂いておきながらおざなりな応対になって申し訳ない。 時間調整のため、PC を少し開いて娯楽タイム。

16:35 外出。押上駅まで一直線。電車に乗って小川町駅へ行く。

17:30 秋葉原 HEY 二階。イルベロをまずは 2 ゲーム。二つの内容をいい感じにマージしたい。 ビートマニアも段位認定を遊ぶ。七段合格だが、このコースは爽快感のようなものがほとんどない。 Wanna Party の音がいいくらい。

18:30 小諸そば昌平橋店。430 円。かき揚げそば大盛り。

HEY に戻る。三階でコットンロックンロールを 1 クレ。ピラミッド面ボスで終了。 自機のいるところに敵機が湧くのはカンベン願いたい。というか、パワーアップが出る場所に出やがる。

あと、この筐体のゲーム選択画面に見慣れぬ絵があるのでカーソルを合わせる。 ノスフェラトゥとある。吸血鬼の? そしてデモ画面を見ると何やら悪魔城的雰囲気がビンビンする。 1 クレ行ってみる。オオカミやコウモリが出現したり、霧に化けたりと、どこかで見たような物たちがある。 正直なところ、加齢のせいでチュートリアルモードの説明が頭に入らない。 意外にたくさんのボタンを使う。 そして、操作性がたぶんよろしくない。ガイコツを叩いたあとに自機が後ろを向いてミスる。 コウモリジャンプが妙に難しい。そもそもジャンプの設計が良くないまである。 そして画面の解像度がモニターサイズに合致していない。

二階に戻って追いイルベロ。2 クレ行って今度はひどいスコア。ゲンナリして退店。

20:50 小川町駅。電車に乗って押上駅に移動。そのまま寄り道せずに曳舟の部屋に戻る。

シャワーを浴びて風呂から出ると乾いている服を着て PC を起動する。

今さら glViewport の復習。なんと (x, y) は矩形左下の座標だと発覚。完全に誤解していた。 手許のコードを少しいじって確認する。これは反省したい。 この前の座標変換関数でウィンドウ上向きを正として扱う版に統一したのは結果的には正解だった。

自らに与える罰として WebGL でビューポートのデモを書く。生産性ゼロ。 せっかくだから MP4 に収録して Twitter に投稿しておく。