これをまだ紹介していなかった。改めて献本御礼。

クォータニオン - UEI/ARC shi3zの日記
クォータニオンは四元数と呼ばれる数学上の特殊な概念で、1995年の日本には少なくともクォータニオンを解説した書籍はひとつもなかった。大学の図書館で何度検索しても見つからず、結局、秋葉原の書泉ブックタワーで、一万円もする分厚い洋書を買って、そこにほんの2ページばかり載っていただけだった。

実のところ実用面における四元数 (Quaternion) が知られていないのは今もそれほど変わっていないのだけど、「これ読め」ならこうしてまとまっているのだから。

本書「実例で学ぶゲーム3D数学」は"3D Math Primer for Graphics and Game Development"の全訳。本書があくまで数学の本であってプログラミングの本でないのは、コードサンプルが生のC/C++で書かれていることでもわかる。これがプログラミングの本であったらOpenGLやDirectXを使っていただろう。

それだけにむしろ本書の理論と実践のバランスは、それぞれの専門書よりも取れていると感じた。ゲームプログラマーでない私にもよい線形代数の復習となった。うち一番目から鱗だったのが、四元数の扱い。

むしろ数学や物理を習った人は、「四元数」という言葉を見て不吉に感じるのではなかろうか。あの大天才ハミルトンは、自らの発見にはまって逝ってしまったのだから。

ウィリアム・ローワン・ハミルトン - Wikipedia
晩年のハミルトンは、アルコール中毒に溺れながら誰にも理解される事のない数学研究に没頭した。遺体が発見された時、ハミルトンの部屋は酒と肉汁にまみれた二百数十冊のノートで埋め尽くされており、この中には正しい物、誤った物、判断のつかない物が入り混じった数式の山が残されていたという。また四元数は一部に「四元数カルト」と呼ぶべき一団を構成するものの、大勢からは無視され、省みられるまでに100年ほどの時間を必要とした。

その「四元数」に引導を渡したのが、ベクトル解析。そこにおいてハミルトニアンはなくてはならないものだというのが歴史の皮肉をさらに深めている。

そんな四元数が復権を果たした--いや、果たしつつあるというべきか--のは、なんと1990年代。手元の「数学用語小辞典」(原著1992年、訳書1996年)を見ても、四元数はハミルトンの欄にはあっても独立した項目がなかったぐらいだ。

Quaternion - Wikipedia, the free encyclopedia
^ Ken Shoemake (1985). "Animating Rotation with Quaternion Curves". Computer Graphics 19 (3): 245–254. doi:10.1145/325165.325242. http://www.cs.cmu.edu/~kiranb/animation/p245-shoemake.pdf. Presented at SIGGRAPH '85.
Tomb Raider (1996) is often cited as the first mass-market computer game to have used quaternions to achieve smooth three-dimensional rotations. See, for example, Nick Bobick's, "Rotating Objects Using Quaternions", Game Developer magazine, July 1998

ゲームへの応用も、Tomb Raiderが嚆矢だとある。ララは四元数の賜物だったのだ。

それではなぜ四元数なのか。

すべてのジンバルロックを、生まれる前に消し去れるからだ。

専門家でなくとも、3Dを扱うのに三次元における物体の向きを扱う必要があることはわかる。その向きをどう表現するか?軸を三つ用意して、その角度を使えばいいというのは子供でも理解できる。首を左右に傾けるのがロール(roll)、前後に振るのがピッチ(pitch)、左右に振るのがヨー(yaw)。三軸で方角を表すことを、専門用語ではオイラー角という。

ところが、オイラー角だと方角が一意に定まらないのだ。同じ3次元でも位置は(x,y,z)で一意に決まるのに。たとえば、真上を向くことを考えてみよう。素直に首を90度上に傾けてもよいが、左右どちらを向いてから首を上げてもやはり真上になってしまう。

これが、ジンバルロックだ。

Gimbal lock - Wikipedia, the free encyclopedia
Gimbal lock is the loss of one degree of freedom in a three-dimensional space that occurs when the axes of two of the three gimbals are driven into a parallel configuration, "locking" the system into rotation in a degenerate two-dimensional space.
ジンバル - Wikipedia
航空宇宙分野の慣性航法システムのジャイロにおけるジンバルなど、3軸の全てに自由な運動がある場合は、機体の回転によって3つのジンバルリングのうち2つの軸が同一平面上にそろってしまうジンバルロックという現象が発生しうる。発生すると、本来3あるはずの自由度が2になってしまう。

これがいかに困った自体を引き起こすか。アポロ11号は、それで遭難しかけたのである。

Gimbal lock - Wikipedia, the free encyclopedia
Rather than try to drive the gimbals faster than they could go, the system simply gave up and froze the platform. From this point, the spacecraft would have to be manually moved away from the gimbal lock position, and the platform would have to be manually realigned using the stars as a reference.

このときは天体観測で向きをあわせることによって事なきを得たが、Collinsの「四軸目のジンバルをクリスマスプレゼントに」とはなんとも罪作りな台詞ではないか。これのおかげで歴史が四半世紀程遅れたのだとしたら。

このジンバルロックを、四元数は実に鮮やかに解決してみせる。どう解決しているかは本書を読んでのお楽しみ--といいたいところであるが、よりによってこの肝心要の部分に誤植があった。恐い。恐すぎる。

正誤表 = O'Reilly Japan - 実例で学ぶゲーム3D数学より。

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すで修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

■P.164 式9-9
  • 【誤】誤った図
  • 【正】正しい図
■P.167 式9-13
  • 【誤】誤った図
  • 【正】正しい図

これ、一体どこが間違っているのかぱっと見ておわかりいただけるだろうか?私も一目ではわからなかった。最後の×(cross product)に注目。v1v2が逆になっている。残念ながらこのかけざんは3x5と違って順番が×だと×である。くわばらくわばら。

クォータニオン - UEI/ARC shi3zの日記
「そうだな。じゃクォータニオンをサポートさせようか。あれがあるといろいろ便利だしねえ」

私の記憶が確かなら、OpenGLもまだネイティブにはサポートしていない。Webをざっと見る限り、皆自前でやっているようだ。こういうものこそ、ライブラリー化すべきだと思うのだが。専門書ですら誤植がなかなか指摘されないのだから。

ゲームに限らず、位置と方角を扱うプログラムを書いていて途方に暮れている方は、ぜひ。地図そのものだって間違っている可能性があることをも本書は教えてくれたけど。

Dan the Disoriented

目次O'Reilly Japan - 実例で学ぶゲーム3D数学より
訳者まえがき
まえがき
1章 デカルト座標系
1.1 1D数学
1.2 2Dデカルト数学
1.3 2Dから3Dへ
1.4 練習問題
2章 複数の座標空間
2.1 なぜ複数の座標空間を使うのか?
2.2 便利な座標空間
2.3 入れ子になった座標空間
2.4 座標空間を指定する
2.5 座標空間の変換
2.6 練習問題
3章 ベクトル
3.1 ベクトル ─ 数学的な定義
3.2 ベクトル ─ 幾何学的な定義
3.3 ベクトルと点
3.4 練習問題
4章 ベクトルの演算
4.1 線型代数 vs. 私たちが必要とするもの
4.2 フォントの約束事
4.3 ゼロベクトル
4.4 ベクトルの反転
4.5 ベクトルの大きさ(長さ)
4.6 ベクトルにスカラーを掛ける
4.7 ベクトルの正規化
4.8 ベクトルの足し算と引き算
4.9 距離の公式
4.10 ベクトルの内積
4.11 ベクトルの外積
4.12 線型代数の恒等式
4.13 練習問題
5章  簡単な3Dベクトルクラス
5.1 クラスのインタフェース
5.2 Vector3クラスの定義
5.3 設計上の決定
6章 行列入門
6.1 行列 ─ 数学的な定義
6.2 行列 ─ 幾何学的解釈
6.3 練習問題
7章 行列と線型変換
7.1 オブジェクトの変換と座標空間の変換
7.2 回転
7.3 スケーリング
7.4 正投影
7.5 リフレクション
7.6 せん断
7.7 座標変換の合成
7.8 座標変換の分類
7.9 練習問題
8章 より詳しい行列の説明
8.1 行列式
8.2 逆行列
8.3 直交行列
8.4 4×4の同次座標行列
8.5 練習問題
9章 3Dにおける方向と角変位
9.1 方向とは何か?
9.2 行列形式
9.3 オイラー角
9.4 四元数
9.5 手法の比較
9.6 表現間の変換
9.7 練習問題
10章 C++による座標変換
10.1 概説
10.2 EulerAnglesクラス
10.3 Quaternionクラス
10.4 RotationMatrixクラス
10.5 Matrix4x3クラス
11章 幾何形状プリミティブ
11.1 表現手法
11.2 直線と光線
11.3 球と円
11.4 バウンディングボックス
11.5 平面
11.6 三角形
11.7 ポリゴン
11.8 練習問題
12章 幾何テスト
12.1 2Dの陰関数形式の直線上の最も近い点
12.2 パラメトリックな光線上の最も近い点
12.3 平面上の最も近い点
12.4 円/球上の最も近い点
12.5 AABBで最も近い点
12.6 交差テスト
12.7 2Dの陰関数形式の2本の直線の交差
12.8 3Dにおける2本の光線の交差
12.9 光線と平面の交差
12.10 AABBと平面の交差
12.11 3つの平面の交差
12.12 光線と円/球との交差
12.13 2つの円/球の交差
12.14 球とAABBの交差
12.15 球と平面の交差
12.16 光線と三角形の交差
12.17 光線とAABBの交差
12.18 2つのAABBの交差
12.19 他のテスト
12.20 AABB3クラス
12.21 練習問題
13章 三角形メッシュ
13.1 メッシュを表現する
13.2 付加的なメッシュ情報
13.3 トポロジーと一貫性
13.4 三角形メッシュの操作
13.5 C++の三角形メッシュクラス
14章 グラフィックス用の3D数学
14.1 グラフィックスパイプラインの概要
14.2 視野のパラメータを設定する
14.3 座標空間
14.4 ライティングとフォグ
14.5 バッファ
14.6 テクスチャマップ処理
14.7 幾何形状の生成と送出
14.8 座標変換とライティング
14.9 裏面カリングとクリッピング
14.10 ラスタライズ処理
15章 可視性の決定
15.1 バウンディグボリュームテスト
15.2 空間分割テクニック
15.3 グリッド方式
15.4 四分木と八分木
15.5 BSPツリー
15.6 オクルージョンカリングテクニック
付録A 数学の復習
A.1 総和の記号
A.2 角度、度、ラジアン
A.3 三角関数
A.4 三角恒等式
付録B ゲーム開発者のための確率・統計入門
B.1 確率
B.2 統計
B.3 乱数
B.4 さいごに
付録C 参考文献
あとがき
索引