145 9 3D 本 章 では 3Dにおける 方 向 について 説 明 します 本 章 は 6つの 節 に 分 かれています 9.1 節 は 方 向 (orientation) 向 き(direction)および 角 変 位 (angular displacement)の 用 語 間 の 微 妙 な 違 いについて 説 明 します 9.2 節 は 行 列 を 使 ってどのように 方 向 を 表 現 するかについて 説 明 します 9.3 節 は オイラー 角 を 使 ってどのように 角 変 位 を 表 現 するかについて 説 明 します 9.4 節 は 四 元 数 を 使 ってどのように 角 変 位 を 表 現 するかについて 説 明 します 9.5 節 は この3つの 方 法 を 比 較 対 比 します 9.6 節 は 方 向 をどのようにある 形 式 から 別 の 形 式 に 変 換 するかを 説 明 します 本 章 では 3Dのオブジェクトの 方 向 を 記 述 するという 難 しい 問 題 に 取 り 組 みます また 密 接 に 関 連 する 概 念 である 角 変 位 についても 説 明 します 3Dでは 複 数 の 方 法 で 方 向 と 角 変 位 を 表 現 でき ます ここでは 3つの 最 も 重 要 な 手 法 を 説 明 します 行 列 オイラー 角 四 元 数 です それぞれの 手 法 について どのようにその 表 現 手 法 が 機 能 するかを 正 確 に 定 義 し その 手 法 の 特 性 長 所 短 所 を 説 明 します 異 なる 状 況 では 異 なるテクニックが 必 要 になり 各 テクニックには 長 所 と 短 所 があります 各 手 法 がどのように 機 能 するのかを 理 解 するだけでなく 特 定 の 状 況 ではどのような 手 法 が 最 も 適 切 か 表 現 の 間 でどのように 変 換 するのかを 理 解 することも 重 要 です 本 章 では 2.2 節 で 説 明 したオブジェクト 空 間 と 慣 性 空 間 という 用 語 を 至 る 所 で 使 用 します 9.1 3Dで 方 向 をどう 表 現 するかを 議 論 する 前 に まず 私 たちが 何 を 表 現 しようとしているのかを 正 確 に 定 義 しましょう 本 節 では 方 向 が 他 の 以 下 の 類 似 の 用 語 とどう 関 連 しているかを 説 明 します 向 き 角 変 位
146 9 章 3D における方向と角変位 回転 直感的には オブジェクトの方向はオブジェクトがどの向きに面しているかです しかしながら向 きは厳密には方向と同じではありません ベクトルは 向き を持っていますが 方向 は持っていな いのです この違いは以下のとおりです ベクトルがある向きを指しているとき ベクトルをその長 ベクトルは長さ以外の厚さや大きさを持たない さに沿って ひねる ことができます 図 9-1 参照 ので このとき ベクトル つまりその向き は実際には変化しません 図 9-1 長さに沿ってベクトルをひねっても ベクト ルには目に見える変化はない しかし ある向きに面しているオブジェクトがあり ベクトルをひねったのと同様にそのオブジェ オブジェクトの方向は変化します クトをひねった場合 図 9-2 参照 図 9-2 オブジェクトをひねると方向が変わる 技術的には このことは 方向は最低 3 つの数を必要とする一方 3D における向きは 2 つの数字 す なわち 極座標 だけを使ってパラメータ化できるという事実により示されます オブジェクトの位置を指定するとき 絶対的に指定することはできません なぜなら位置は 常に これまで 位置を指定するこ 特定の基準座標系の中で指定する必要があるからです 3.3.1 節参照 とは 実際には与えられた参照点 通常は 何らかの座標系の原点 からの平行移動量を指定するこ とと同じであることを見てきました 同様に オブジェクトの方向を表現するときに方向は絶対的には表現することはできません 位置 3DGameBook.indb 146 08.9.3 3:59:25 PM
9.2 行列形式 147 がある既知の点からの平行移動により与えられるのと同じで 方向はある既知の参照となる方向 よ く恒等方向または ホーム方向と呼ばれます からの回転により与えられます 回転の量は角変位と して知られています 言い換えれば 方向を表現することは角変位を表現することと数学的に同値 なのです 数学的に同値 というのは 本書では方向と 角変位や回転のような用語との間にわずかな区別 を付けているからです 角変位を それに付随して座標変換の向きを持つものとして考えるとわかり やすいでしょう 例えば 古い方向から新しい方向への角変位 または 慣性空間からオブジェクト 空間への角変位などです つまりソースとデスティネーションの関係が存在するのです 方向は ソースとデスティネーションの関係ではなく親と子の関係を表現しているような状況で使われます この方向と角変位の区別は 点とベクトルの区別に似ています この 2 つの用語も数学的には同値で すが 概念的には同一ではありません どちらの場合も 前者の用語は主に単一の状態を表現し 後者の用語は主に 2 つの状態の間の違いを表現するのに使われます もちろん これらの約束事は純粋に好みの問題ですが 役に立ちます 特に 私たちは角変位を 表す行列と四元数 および方向を表現するオイラー角について考えることにします 9.2 行列形式 3D の座標空間で方向を表現する 1 つの方法は ある座標空間の基底ベクトルを 他の座標空間を 使って表現して列挙することです これらの基底ベクトルを行として使って 3 3 行列にすると 行 列の形式で方向を表現したことになります 別の言い方をするなら ベクトルをある座標空間から別 の座標空間へ座標変換するのに使う回転行列を与えることで 2 つの座標空間の相対方向を表現でき るということです 図 9-3 行列を用いた方向の定義 9.2.1 どの行列 ここまでは 行列を使って点をある座標空間から別の座標空間へ座標変換する方法について見て きました 行列を使って角変位を表現することを話題にする場合には 正確にはどの座標変換のこ 3DGameBook.indb 147 08.9.3 3:59:25 PM
148 9 3D とを 言 っているのでしょうか? この 行 列 は ベクトルを 慣 性 空 間 からオブジェクト 空 間 へ 座 標 変 換 するのでしょうか? あるいは 反 対 向 きでしょうか? 本 章 での 目 的 としては それは 問 題 にはなりません 座 標 変 換 後 の 基 底 ベクトルを 列 挙 すること で 行 列 が 方 向 を 表 現 するということで 十 分 なのです ある 座 標 空 間 から 別 の 座 標 空 間 への 回 転 を 表 現 することにより( 表 現 対 象 としてどちらの 座 標 変 換 を 選 んだとしても) 私 たちは 方 向 を 規 定 して いるのです 行 列 の 座 標 変 換 の 実 際 の 向 きは 実 装 時 の 詳 細 です 回 転 行 列 は 直 交 行 列 なので(8.3 節 参 照 ) ある 行 列 を 使 うか 別 の 行 列 を 使 うかは 必 要 なら 単 に 逆 変 換 を 得 るためにそれを 転 置 すると いう 問 題 に 過 ぎません 9.2.2 行 列 形 式 は 方 向 を 表 現 するとても 明 示 的 で 明 快 な 形 式 です この 明 示 的 な 性 質 にはいくつかの 利 点 があります ベクトルの 回 転 が 即 座 に 利 用 できます 行 列 形 式 の 最 も 重 要 な 性 質 は 行 列 を 使 って オブジェ クト 空 間 と 慣 性 空 間 の 間 でベクトルを 回 転 できることです これは 方 向 の 他 のどの 表 現 方 法 にもできないことです ベクトルを 回 転 させるためには 方 向 を 行 列 形 式 に 変 える 必 要 があり ます 四 元 数 の 長 所 として 乗 算 を 通 して 回 転 を 実 行 するのに 使 えるということがよく 言 われ ています(9.4.8 節 参 照 ) しかし その 計 算 を 調 べれば この 近 道 は 結 局 対 応 する 回 転 行 列 による 乗 算 になることがわかるでしょう グラフィックスAPI で 使 われる 形 式 です 前 の 段 落 で 述 べたことを 理 由 の 一 部 として グラ フィックスAPIは 方 向 を 表 現 するのに 行 列 を 使 っています グラフィックス APIを 使 うときに は 最 終 的 には 座 標 変 換 を 行 列 として 表 現 する 必 要 があります 座 標 変 換 をプログラム 内 でど のように 格 納 するかはみなさん 次 第 ですが 他 の 表 現 方 法 を 選 んだ 場 合 は グラフィックスパ イプライン 内 のある 時 点 でそれらを 行 列 に 変 更 する 必 要 があるのです 複 数 の 角 変 位 の 連 結 ができます 行 列 の 第 2の 長 所 は 入 れ 子 になった 座 標 空 間 の 関 係 を 集 約 することができる 点 です 例 えば オブジェクトBに 対 するオブジェクトAの 方 向 がわかって いて オブジェクトCに 対 するオブジェクトBの 方 向 がわかっていれば 行 列 を 使 って オブ ジェクトCに 対 するオブジェクトAの 方 向 を 決 定 することができます これらの 概 念 は 2 章 で 入 れ 子 になった 座 標 空 間 について 学 んだときに 遭 遇 し また 行 列 がどのように 連 結 できるか については7.6 節 で 説 明 しました 逆 行 列 を 使 えます 角 変 位 が 行 列 形 式 で 表 現 されていると 逆 行 列 を 使 って 逆 の 角 変 位 を 計 算 することができます 回 転 行 列 は 直 交 行 列 なので この 計 算 は 行 列 を 転 置 させるだけの 簡 単 な ことです API とはアプリケーションプログラミングインタフェースの 略 です 要 するに ビデオハードウェアと 通 信 す るために 使 うコードです
9.2 149 9.2.3 前 節 で 述 べたように 行 列 はその 明 示 的 であるという 性 質 により いくつかの 長 所 を 持 っています しかしながら 行 列 は 方 向 を 格 納 するのに9 個 の 数 を 使 っていますが 方 向 はたった3つの 数 でパラ メータ 化 することが 可 能 なのです これらの 余 分 な 数 は いくつかの 問 題 の 原 因 となりえます 行 列 はメモリを余 計 に 使 います アニメーションシーケンスのキーフレームのように たくさ んの 方 向 を 格 納 する 必 要 がある 場 合 その 数 が3つでなく9つであるための 余 分 な 空 間 は 実 際 無 視 できません 控 え 目 な 例 を 考 えてみましょう さまざまな 体 のパーツが15 個 のピースに 分 かれた 人 間 のモデルをアニメーションさせるとします 各 パーツの 親 パーツに 対 する 相 対 的 な 方 向 を 厳 密 に 制 御 することで アニメーションを 実 現 しています フレームごとに 各 パー ツに 対 して1つの 方 向 を 格 納 しており このアニメーションデータは 15Hzという 適 切 なレー トで 格 納 されているとします つまり 1 秒 間 に225 個 の 方 向 を 保 持 しているということです 行 列 と32ビットの 浮 動 小 数 点 数 を 使 うと 1 秒 ごとに8,100バイトが 必 要 です オイラー 角 (9.3 節 で 出 てきます)を 使 うと 同 じデータで2,700バイトしか 使 いません 例 えばたった30 秒 間 のアニメーションデータで オイラー 角 を 使 って 同 じデータを 格 納 した 場 合 よりも 行 列 は 162Kバイトも 多 く 必 要 とします 人 間 には 使 いにくいです 行 列 は 人 間 が 直 接 扱 うには 直 感 的 ではありません 数 がたくさん ありすぎ それらはすべて 1 と 1 の 間 です さらに 人 間 は 方 向 を 角 度 で 考 えるのが 自 然 で すが 行 列 はベクトルを 使 って 表 現 しています 練 習 すれば 与 えられた 行 列 から 方 向 を 解 読 する 方 法 を 習 得 できます これには 行 列 を 可 視 化 する6.2.2 節 のテクニックが 役 に 立 ちます こ れでもまだオイラー 角 よりもずっと 難 しく 逆 に 方 向 から 行 列 を 求 めることもずっと 困 難 です 自 明 でない 方 向 の 行 列 を 手 作 業 で 構 築 するには 大 変 な 時 間 がかかります 一 般 的 に 言 って 行 列 は 人 間 が 方 向 を 考 える 自 然 な 方 法 ではないということです 行 列 は 不 正 な 形 式 になることがあります 3つの 数 で 十 分 なのに 行 列 は9つの 数 字 を 使 ってい ます 言 い 換 えると 行 列 は6 度 の 冗 長 性 を 含 んでいます 行 列 が 方 向 を 有 効 に 表 現 するため には6つの 制 限 が 満 たされる 必 要 があります 行 は 単 位 ベクトルでなければならず 互 いに 垂 直 でなければならないのです(8.3.2 節 参 照 ) この 最 後 の 点 をもっと 詳 細 に 考 えてみましょう もし9つの 数 をランダムに 持 って 来 て 3 3 行 列 を 作 ったら これらの6つの 制 限 を 満 たしている 可 能 性 はきわめて 低 いでしょう したがって この 9つの 数 は 有 効 な 回 転 行 列 を 形 成 しません 言 い 換 えれば 行 列 は 少 なくとも 方 向 を 表 現 するという 目 的 においては 不 正 な 形 式 になる 可 能 性 があるということです 不 正 な 形 式 の 行 列 は 数 値 の 例 外 やその 他 の 予 期 しない 振 る 舞 いの 原 因 となりえるため 問 題 となります なぜ 誤 った 行 列 になってしまうのでしょうか? いくつかのパターンがあります まず スケーリング スキュー リフレクションを 含 んだ 行 列 になっているかもしれません このような 操 作 を 受 けたオブジェクトの 方 向 とはなんでしょうか? これに 対 する 明 確 な 定 義 は 実 際 には 存 在 しません 非 直 交 行 列 はきちんとした 回 転 行 列 ではありません( 直 交 行 列 の 完 全 な 説 明 は8.3 節 を 参 照 ) リフレクション 行 列 は 直 交 行 列 ですが これも 有 効 な 回 転 行 列 で
150 9 3D はありません 第 2に 単 に 外 部 ソースから 間 違 ったデータを 取 り 込 んでしまう 場 合 があります 例 えば モー ションキャプチャのような 物 理 データ 収 集 システムを 使 っている 場 合 キャプチャリング 処 理 によるエラーが 起 こりえます 不 正 な 形 式 の 行 列 を 生 成 するとして 悪 名 高 いモデリングパッ ケージはたくさんあります 最 後 に 浮 動 小 数 点 数 の 丸 め 誤 差 に 起 因 して 実 際 に 間 違 ったデータを 作 成 してしまうことが あります 例 えば 方 向 に 対 して 増 分 変 化 をたくさん 適 用 するとします これは 人 間 がイン タラクティブにオブジェクトの 方 向 を 制 御 できるゲームやシミュレーション 内 では 日 常 的 に 起 こることです 行 列 の 乗 算 は 浮 動 小 数 点 数 の 精 度 の 制 限 を 受 けやすく 多 数 の 行 列 の 乗 算 に より 不 正 な 形 式 の 行 列 になってしまう 可 能 性 があります この 現 象 は 行 列 クリープとして 知 ら れています 8.3.3 節 ですでに 説 明 したように 行 列 を 直 交 化 することにより 行 列 クリープに 対 抗 することができます 9.2.4 9.2 節 で 行 列 を 用 いた 角 変 位 の 表 現 について 学 習 したことをまとめましょう 行 列 は 方 向 を 表 現 する 強 引 な 手 法 です ある 座 標 空 間 の 基 底 ベクトルを 異 なる 座 標 空 間 を 使 って 明 示 的 に 列 挙 しています 方 向 を 表 現 する 行 列 形 式 は 役 に 立 ちます 主 に 座 標 空 間 の 間 でベクトルを 回 転 させることがで きるためです 現 在 のグラフィックスAPIは 行 列 を 使 って 方 向 を 表 現 しています 行 列 の 乗 算 を 使 って 入 れ 子 になった 座 標 空 間 の 行 列 を 単 独 の 行 列 に 集 約 することができます 逆 行 列 は 逆 の 角 変 位 を 決 定 するメカニズムを 提 供 します 行 列 はこれから 学 習 する 他 のテクニックより2~3 倍 のメモリを 必 要 とします これはアニメー ションデータのような 多 数 の 方 向 を 格 納 するときには 効 いてきます すべての 行 列 が 有 効 に 方 向 を 表 現 するわけではありません 行 列 によってはミラーリングやス キューを 含 んでいます 外 部 ソースからの 不 正 なデータの 取 得 や 行 列 クリープによって 不 正 な 形 式 の 行 列 になることがあります 行 列 内 の 数 値 は 人 間 が 取 り 扱 うには 直 感 的 ではありません 9.3 方 向 を 表 現 するもう1つの 一 般 的 な 手 法 は オイラー 角 (Euler angle)として 知 られています (Eulerはエウラーではなくオイラーと 発 音 します) この 技 法 は 一 連 の 複 数 の 角 変 位 は1つの 角 変 位 と 同 値 であることを 証 明 した 有 名 な 数 学 者 レオンハルト オイラー(1707-1783)の 名 前 から 付 け られました
9.3 オイラー角 151 9.3.1 オイラー角とは何か オイラー角の基本的な考え方は 1 つの角変位を互いに垂直な 3 本の軸の周りの 3 つの一連の回転 として定義することです これは複雑に見えますが 実際にはとても直感的です 実際 使いやす さがオイラー角の長所の 1 つです オイラー角は 本当にどんな回転を表現するのにも使えるので角 変位という言葉を使っています しかし本書では 主に親座標空間 ワールド空間など 内でのオブ ジェクトの方向を表現するために使います オイラー角は 方向を互いに垂直な軸の周りの 3 つの回転として表現します しかし どの軸で しょうか また どの順番でしょうか どのような 3 つの軸でいかなる順番でもうまくいくことが わかっていますが ある特定の順番で使うのが最も便利です 最も一般的で 本書で用いる約束事は いわゆるオイラー角のヘディング ピッチ バンク heading-pitch-bank と呼ばれるものです こ の系では方向は ヘディングの角度 ピッチの角度 バンクの角度により定義されます 基本的な 考え方は 恒等方向のオブジェクト すなわち軸が初期状態の軸と一致する方向のオブジェクトから 始めるということです そこから ヘディング ピッチ 最後にバンクの回転を適用し 表現しよう としている方向にオブジェクトが到達するようにします 正確にヘディング ピッチ バンクの用語を定義する前に 簡単に本書で用いる座標空間の約束 事についておさらいしましょう 本書では左手系を使っています そこでは x は右方向 y は また 左手の法則に従って正の回転を定義する方法をお 上方向 z は前方向です 図 1-15 参照 忘れでしたら 図 7-5 に戻って記憶を呼び覚ますとよいでしょう 図 9-4 に示すようにヘディングは y 軸の周りの回転量を決定します 正の回転は右に 上から見 たときに時計回りに 回転します 図 9-4 ヘディングは最初の回転であり y 軸の周りに回転 する ヘディングが適用された後に ピッチが x 軸の周りの回転量を決定します これはオブジェクト 空間の x 軸ですが 元の慣性空間の x 軸ではありません 左手の法則に従っているので正の回転 は下に向くことになります 言い換えれば ピッチは実際には捻転角 angle of declination を決定 しているのです これを図 9-5 に示します 3DGameBook.indb 151 08.9.3 3:59:26 PM
152 9 章 3D における方向と角変位 y 慣性空間とオブジェクト空間 x オブジェクト空間 図 9-5 ピッチは 2 番目の回転でありオブジェクト空間 の x 軸の周りに回転する z 慣性空間 x 慣性空間 z オブジェ クト空間 z オブジ ェクト空間 x 慣性空間 z 慣性空間 x オブジェクト空間 y 慣性空間とオブジェクト空間 最後に ヘディングとピッチが適用された後 バンクが z 軸の周りの回転量を決定します 先ほ どと同様に これはオブジェクト空間の z 軸ですが 元の慣性空間の z 軸ではありません 左手の 法則により 正のバンクは原点から z の方向を見たときに反時計回りに回転します これを図 9-6 に示します y 慣性空間 y オブジェクト空間 z オブジ ェクト空間 図 9-6 バンクは 3 番目の最後の回転であり オブジェ クト空間の z 軸の周りに回転する z x オブジェクト空間 慣性空間 x 慣性空間 x 慣性空間 z オブジェ クト空間 y オブジェクト空間 z 慣性空間 y 慣性空間 x オブジェクト空間 正のヘディングが時計回りなのに正のバンクが反時計回りだというのは 矛盾しているように見え るかもしれません 正のヘディングは 軸の正の端点から原点を見たときの時計回りだということに 注意してください バンクで時計回りか反時計回りかを判定したときに用いたのとは逆の見方なので す 原点から y 軸の正の端点を見れば 正のヘディングは反時計回りに回転します あるいは z 軸の正の端点から原点を見れば オブジェクトの正面から後方を見れば 正のバンクはオブジェク トを時計回りに回転させているように見えます どちらの場合も 左手の法則が使われているのです 回転がヘディング ピッチ バンクの順で起こっているときは オブジェクトを慣性空間からオブ ジェクト空間へ回転させる順番のことを話していることを忘れないでください もし オブジェクト 空間から慣性空間への回転を考えているのなら この順番は逆になります ヘディング ピッチ バンク系に与えられたもう 1 つの名前は ロール ピッチ ヨー roll- pitch-yaw です ここでロールはバンクの同義語で ヨーはヘディングの同義語です 実際には 3DGameBook.indb 152 08.9.3 3:59:27 PM
9.3 153 ヨーは 正 確 にはヘディングと 同 じではありません これについては9.3.2 節 で 詳 しく 説 明 します ロー ル ピッチ ヨー 系 では オブジェクト 空 間 から 慣 性 空 間 へ 回 転 する 順 番 で 角 度 が 名 付 けられている ことに 注 意 してください 9.3.2 前 に 述 べたように ヘディング ピッチ バンク 系 がオイラー 角 の 唯 一 の 系 ではありません 方 向 は 任 意 の 互 い 垂 直 な3 本 の 軸 の 周 りの 任 意 の 並 びの 回 転 で 定 義 することができます いくつかのオプ ションにより オイラー 角 の 約 束 事 にはバリエーションがあります まず ヘディング ピッチ バンク 系 は 他 の 名 前 で 通 っています もちろん 違 う 名 前 で 呼 ん だからといって 違 う 約 束 事 にはなりませんが 注 目 に 値 します 1つの 一 般 的 な 用 語 の 集 合 は ロール ピッチ ヨーです ここで ロールはバンクと 同 じで ヨーは 基 本 的 にはヘディング と 同 じです この 順 番 はヘディング ピッチ バンクと 逆 であることに 注 意 してください こ れは 純 粋 に 意 味 的 な 問 題 です これは ベクトルをオブジェクト 空 間 から 慣 性 空 間 へ 回 転 させ るときの 回 転 の 順 番 を 名 付 けているのです 実 際 には ヨーとヘディングの 間 には 技 術 的 な 違 いがあります ヨーはオブジェクト 空 間 の y 軸 の 周 りの 回 転 であり ヘディングは 慣 性 空 間 の y 軸 の 周 りの 回 転 です この 回 転 はオブジェクト 空 間 の y 軸 が 慣 性 空 間 の y 軸 と 一 致 してい るときに 実 行 されるので この 区 別 は 重 要 ではありません 第 2に 任 意 の3 本 の 軸 を 回 転 の 軸 として 使 うことができます 基 本 軸 を 使 うのが 最 も 便 利 で すが 基 本 軸 でなくてはならないということはありません 第 3に 各 回 転 でどちらの 向 きを 正 と 見 なすかを 定 義 するときに 必 ずしも 左 手 や 右 手 の 法 則 に 従 う 必 要 はありません 例 えば 正 のピッチを 上 方 向 の 回 転 として 定 義 することももちろん 可 能 であり 普 通 のことです 第 4に 最 も 重 要 なことですが 回 転 は 異 なる 順 番 で 行 え その 順 番 は 重 要 であるということ です どんな 系 でも 方 向 を 定 義 できますが 最 も 実 用 的 であるためヘディング ピッチ バン クの 順 が 最 も 広 く 使 われています ヘディングは 垂 直 軸 の 周 りの 回 転 を 決 定 します 私 たちが 作 業 する 環 境 には 何 らかの 平 坦 な 地 面 がある 場 合 が 多 いという 主 な 理 由 で このことには 重 要 な 意 味 があります 慣 性 の x 軸 や z 軸 の 周 りの 回 転 量 がわかっても 通 常 はあまり 役 に 立 ち ません 他 の2つ 角 度 の 順 番 も 便 利 なように 選 ばれています すなわち ピッチは 水 平 線 から の 捻 転 角 として 重 要 であり バンクは z 軸 上 でどれだけひねるかを 決 定 します もしみなさんが お 好 みの 約 束 事 と 違 うものを 使 ってオイラー 角 を 扱 う 必 要 がある 場 合 に 以 下 の 2 点 をアドバイスしておきます まず 他 のオイラー 角 の 系 がどのように 機 能 するかを 正 確 に 理 解 するようにしてください 正 の 回 転 の 定 義 や 回 転 の 順 番 など 細 かいことが 大 きな 違 いとなります 次 に オイラー 角 をみなさんのフォーマットに 変 換 する 最 も 簡 単 な 方 法 は 行 列 形 式 に 変 換 し てからその 行 列 を 好 みのオイラー 角 のスタイルに 変 換 し 直 すことです これらの 変 換 をどのよ うに 行 うかは9.6 節 で 学 習 します 角 度 を 直 接 いじることは 思 っているよりもずっと 困 難 で
154 9 3D す より 詳 しくは 付 録 Cの [21] を 見 てください 9.3.3 オイラー 角 は 方 向 をたった3つの 数 値 でパラメータ 化 し かつ これらの 数 値 は 角 度 です オイ ラー 角 のこの2つの 特 徴 は 方 向 の 他 の 表 現 にはない 明 らかな 長 所 となっています オイラー 角 は 私 たちにとって 使 いやすく 行 列 や 四 元 数 に 比 べてかなり 簡 単 です おそらくこ れは オイラー 角 の3つの 数 値 が 人 間 が 方 向 を 考 えるときに 自 然 に 使 う 角 度 だからです そ の 状 況 で 最 も 適 切 な 約 束 事 としてこれが 選 択 されているならば 最 も 重 要 な 角 度 が 直 接 的 に 表 現 されているはずです 例 えばヘディング ピッチ バンク 系 を 使 えば 捻 転 角 が 直 接 的 に 表 現 されています この 使 いやすさは 重 要 な 長 所 です 方 向 を 数 値 で 表 示 したり キーボードか ら 入 力 したりする 必 要 のある 場 合 には オイラー 角 はまさに 唯 一 の 選 択 肢 です 最 小 の 表 現 が 可 能 です オイラー 角 は3つの 数 値 を 使 って 方 向 を 表 現 します 他 のどんな 系 で も 3つより 少 ない 数 値 で3Dの 方 向 を 表 現 することはできません メモリが 高 価 な 場 合 は オ イラー 角 が 最 も 経 済 的 な 方 向 の 表 現 方 法 です どんな3つの 数 値 でも 有 効 です ランダムに3つの 数 値 を 持 ってきても その 数 値 の 集 合 は 方 向 を 表 現 するものとして 解 釈 可 能 な 有 効 なオイラー 角 を 形 成 します 言 い 換 えれば 無 効 な オイラー 角 となる 集 合 などというものは 存 在 しないのです もちろん 数 値 は 正 しくないかもし れませんが 少 なくとも 有 効 ではあります これは 行 列 や 四 元 数 の 場 合 には 当 てはまりませ ん 9.3.4 本 節 では オイラー 角 の 方 向 表 現 手 法 の 短 所 についていくつか 説 明 します これらは 主 に 以 下 の とおりです 所 定 の 方 向 の 表 現 が 一 意 に 決 まらない 2つの 角 の 間 の 補 間 が 難 しい これらの 点 について 詳 しく 説 明 しましょう まず 所 定 の 方 向 について その 方 向 を 表 すのに 使 え る 異 なるオイラー 角 の3つの 数 値 がたくさん 存 在 する という 問 題 があります これはエイリアシン グ(aliasing)として 知 られており いささか 不 便 な 場 合 があります 2つのオイラー 角 の3つの 数 値 は 同 じ 角 変 位 を 表 現 しているか? というような 基 本 的 な 質 問 も エイリアシングのせいで 答 える のが 困 難 です 第 1の 最 も 簡 単 なエイリアシングの 形 式 は ある 角 度 に 360 の 倍 数 を 加 えたときに 起 こります 明 らかに まるまる1 周 分 の 数 値 を 加 えても 数 値 は 異 なりますが 表 現 される 方 向 は 変 わりません 第 2のもっと 厄 介 なエイリアシングの 形 式 は 3つの 角 度 が 互 いに 完 全 に 独 立 でないために 起 こり ます 例 えば 135 ピッチを 下 げることは 180 ヘディングし 45 ピッチを 下 げ その 後 180 バンクするのと 同 じです いかなる 所 定 の 方 向 に 対 しても 一 意 な 表 現 を 保 証 するためには 角 度 の 範 囲 に 制 限 を 設 ける 必 要
9.3 155 があります 最 も 一 般 的 な1つのテクニックは ヘディングとバンクを ±180 に 制 限 し ピッチを ±90 に 制 限 することです これはオイラー 角 の 正 準 集 合 を 規 定 します いかなる 方 向 に 対 しても その 方 向 を 表 現 するオイラー 角 の 正 準 集 合 は1つしか 存 在 しません 実 際 には 対 処 する 必 要 のある 面 倒 な 特 異 点 がもう1つあるのですが それについてはすぐに 説 明 します 筆 者 らのコードで オイラー 角 のパラメータを 取 るほとんどすべての 関 数 は 任 意 の 範 囲 のオイ ラー 角 で 正 常 に 動 きます しかし オイラー 角 を 計 算 する すなわち 返 すコードを 書 く 際 には 常 に 正 準 なオイラー 角 の3つ 組 を 返 すようにしています 正 準 オイラー 角 を 使 うことで 私 はほぼ 東 を 向 いていますか? というような 多 くの 基 本 的 なテストを 単 純 化 できます オイラー 角 で 悩 まされる 最 も 有 名 な(そして 面 倒 な)タイプのエイリアシング 問 題 を 以 下 の 例 で 説 明 します 45 右 へヘディングし 90 ピッチを 下 げると これは 90 ピッチを 下 げてから 45 バンクしたのと 同 じです 事 実 ピッチの 角 度 として ±90 を 選 ぶと 垂 直 軸 の 周 りの 回 転 に 制 限 されてしまうのです この 現 象 すなわち 第 2の 回 転 角 が ±90 だと 第 1と 第 3の 角 度 の 回 転 が 同 じ 軸 の 周 りの 回 転 になってしまう 現 象 は ジンバルロック(Gimbal lock)として 知 られています こ のエイリアシングをオイラー 角 の3つ 組 の 正 準 集 合 から 除 去 するために ジンバルロックのケースで は 垂 直 軸 の 周 りのすべての 回 転 をヘディングに 割 り 当 てます 言 い 換 えれば 正 準 集 合 では ピッ チが ±90 ならバンクは 0 であるということです 方 向 を 表 現 するという 目 的 からは エイリアシングはそれほど 大 きな 問 題 になりません 特 に 正 準 のオイラー 角 を 使 っている 場 合 はそうです しかし 仮 に2つの 方 向 AとBの 間 を 補 間 したいとしま しょう 言 い 換 えれば 所 定 のパラメータ t(0 t 1)に 対 し t が 0 から 1 に 変 化 するにつれ A からBへの 変 化 を 滑 らかに 補 間 するような 中 間 の 方 向 Cを 計 算 したいのです これは 例 えばキャラ クタアニメーションや 自 動 カメラにとって 非 常 に 役 に 立 つ 演 算 です この 問 題 に 対 するナイーブなアプローチは 3つの 角 度 それぞれに 独 立 に 標 準 の 線 型 補 間 式 を 適 用 することです この 式 を 以 下 に 示 します これは 問 題 だらけです まず 正 準 オイラー 角 が 使 われていないと 角 度 の 値 が 大 きくなってしまう 場 合 があります 例 えば 方 向 Aのヘディングが 720 で 方 向 Bのヘディングが 45 だと 想 像 してください 720 =2 360 で 0 と 同 じです したがって 基 本 的 にはヘディングの 値 は 45 しか 離 れていません しかし この 素 朴 な 補 間 では 図 9-7に 示 すように 逆 の 向 きに2 周 近 く 回 ってしまいます
156 9 章 3D における方向と角変位 図 9-7 素朴な補間は よけいな回転を生じることがある もちろん この問題に対する解決策は正準オイラー角を使うことです 常に正準オイラー角の 2 つ の集合の間を補間しているという前提にすることは可能です あるいは 補間ルーチンの内部で正準 値に変換することで この前提条件を強制しようとすることも可能です 単純に角度を 180... 180 の範囲内にラップすることは簡単ですが 90... 90 の範囲からはずれたピッチの値を処理す るのは それより大変です しかしながら 正準な角を使ったとしても この問題を完全に解決したことにはなりません 回転 角の周期性に起因する第 2 の形式の補間問題が起こりえます A のヘディングが 170 で B のヘ ディングが 170 だったとします これらはどちらも 180... 180 の範囲内でヘディングの正準値 であることに注意してください 2 つのヘディングの値は 20 しか離れていませんが 先ほどと同様 ナイーブな補間ではこれを正しく扱えず 図 9-8 に示すように 短い方の 20 のパスを取らずに 340 も遠回りして回転してしまいます 図 9-8 ナイーブな補間は遠回りして回転することがある この第 2 の形式の問題の解決策は 補間式内で使われている角の差分を 180... 180 の範囲に ラップして 最短の弧を見つけることです 3DGameBook.indb 156 08.9.3 3:59:28 PM
9.3 157 これら2つの 一 時 しのぎをしてもなお オイラー 角 の 補 間 はジンバルロックに 悩 まされ 多 くの 状 況 でぎくしゃくした 不 自 然 なコースを 取 ることになるのです オブジェクトが 突 然 方 向 を 変 えたり どこかに 張 り 付 いたように 見 えたりします 基 本 的 な 問 題 は 補 間 の 最 中 に 角 速 度 が 一 定 していない ことです みなさんがまだジンバルロックがどのように 見 えるか 経 験 したことがなければ 何 をそれ ほど 大 騒 ぎしているのかと 不 思 議 に 思 うかもしれません 残 念 なことに この 問 題 を 本 書 のイラスト から 十 分 に 理 解 するのはとても 難 しいのです インタラクティブに 経 験 してみる 必 要 があり 幸 運 に も 本 書 のWebページ(gamemath.com)に ジンバルロックの 優 れたインタラクティブなデモがあ ります オイラー 角 の 補 間 の 最 初 の2つの 問 題 は 面 倒 ではありますが 確 実 に 克 服 することが 可 能 です 正 準 オイラー 角 を 使 うことと 差 分 値 を 範 囲 内 にラップすることは 比 較 的 簡 単 な 回 避 策 です しかし 残 念 なことに ジンバルロックは ちょっと 厄 介 な 問 題 という 以 上 の 根 本 的 な 問 題 なのです ひょっ とすると 方 向 を 再 び 公 式 化 して これらの 問 題 の 影 響 を 受 けない 系 を 考 え 出 すことができるでしょう か? 残 念 ながら それは 不 可 能 です 3Dの 方 向 を 表 現 するのに3つの 数 値 を 使 うということに 伴 う 固 有 の 問 題 が 確 固 として 存 在 するのです 問 題 の 形 を 変 えることはできますが 除 去 することはで きません 3つの 数 値 を 使 って3 次 元 の 方 向 をパラメータ 化 するいかなる 系 にも パラメータ 化 空 間 に 特 異 点 が 存 在 することが 保 証 されており したがって ジンバルロックのような 問 題 を 免 れること はできません 9.4 節 で これらの 問 題 を 四 元 数 を 使 ってどのように 克 服 するかについて 学 習 します 9.3.5 9.3 節 のオイラー 角 についての 結 論 をまとめましょう オイラー 角 は3つの 角 度 を 使 って 方 向 を 格 納 します これらの 角 度 は 互 いに 垂 直 な3 本 の 軸 の 周 りの 順 序 付 けられた 回 転 を 表 します オイラー 角 の 最 も 一 般 的 な 系 はヘディング ピッチ バンク 系 です 方 向 を 表 現 する 他 の 手 法 に 比 べて ほとんどの 場 合 オイラー 角 は 私 たちにとって 直 感 的 に 扱 えます メモリが 高 価 なときには オイラー 角 は 最 小 のデータ 量 で3Dの 角 を 格 納 することができます オイラー 角 には 無 効 な 集 合 というものは 存 在 しません どんな3つの 数 値 でも 意 味 のある 解 釈 ができます オイラー 角 には エイリアシング 問 題 が 起 こります 回 転 角 の 周 期 性 のためと 回 転 が 互 いに 完 全 独 立 でないためです 正 準 オイラー 角 を 使 うと オイラー 角 に 対 する 基 本 的 な 多 くの 質 問 を 単 純 化 することができま す ヘディングとバンクが 180... 180 の 範 囲 で ピッチが 90... 90 の 範 囲 の 場 合 そ のオイラー 角 の3つ 組 は 正 準 集 合 です さらに ピッチが ±90 ならばバンクは 0 です
158 9 3D ジンバルロックはピッチが ±90 のときに 起 こります この 場 合 ヘディングとバンクはどち らも 垂 直 軸 周 りの 回 転 になるので 自 由 度 が1つ 失 われます オイラー 角 を 使 って 表 現 された2つの 方 向 の 間 の 補 間 は 解 決 が 困 難 です 単 純 な 形 式 のエイ リアシングは 面 倒 ではありますが 回 避 策 が 存 在 します ジンバルロックはもっと 根 本 的 な 問 題 で 簡 単 な 解 決 策 は 存 在 しません 9.4 四 元 数 という 用 語 は 3D 数 学 においてはきちんと 理 解 されずに 広 まったちょっとした 流 行 語 です それは 多 分 ほとんどの 人 が 四 元 数 を 理 解 していないからです 四 元 数 を 取 り 巻 くこの 謎 は 主 と して 多 くのテキストでの 四 元 数 の 取 り 上 げ 方 に 起 因 しています 願 わくは 本 書 が 四 元 数 に 関 する みなさんの 混 乱 を 解 決 する 手 助 けになることを 望 みます 3 次 元 の 方 向 を 表 現 するのに3つの 数 値 しか 使 わないと なぜ オイラー 角 で 説 明 したジンバル ロックのような 問 題 が 起 こることが 保 証 されているかには 数 学 的 な 理 由 があります これは 多 様 体 のようなかなり 高 度 ないくつかの 数 学 用 語 に 関 係 することです 四 元 数 は 方 向 を 表 現 するのに4 つの 数 値 を 使 うことにより これらの 問 題 を 回 避 します それで 四 元 数 という 名 前 なのです 9.4.1 四 元 数 には 1つのスカラー 要 素 と1つの3Dベクトル 要 素 が 含 まれます 通 常 スカラー 要 素 を wと 表 します ベクトル 要 素 は 1つの 塊 としては v と 表 し 個 々の 要 素 としては x y z と 表 し ます 両 方 の 表 記 法 を 以 下 に 示 します v を 使 った 短 い 表 記 法 を 使 う 方 が 便 利 な 場 合 もありますし 展 開 されたものの 方 が 明 瞭 な 場 合 も あります 本 章 では 可 能 な 場 合 は すべての 式 を 両 方 の 形 式 で 示 しています この4つの 数 値 が 正 確 に 何 を 表 現 しているかは この 後 すぐに 説 明 します 四 元 数 を 縦 に 書 くこともあります これは 式 の 体 裁 を 整 えるためだけのものです 行 の 四 元 数 と 列 の 四 元 数 の 間 には 意 味 のある 区 別 はありません 9.4.2 ここでちょっと 脱 線 して 複 素 数 学 の 話 をします 四 元 数 は 完 全 に 幾 何 学 的 視 点 から 解 釈 すること が 可 能 ですので この 話 題 は 四 元 数 の 使 い 方 を 理 解 するのに 絶 対 に 必 要 というわけではありません しかし 四 元 数 という 数 学 的 遺 産 とその 発 明 をめぐる 出 来 事 を 知 るのは 興 味 深 いことです 複 素 数 対 (a,b) が 複 素 数 a+bi を 定 義 することを 思 い 出 してください ここで i は i 2 = 1 となるような いわゆる 虚 数 です aは 実 数 部 と 呼 ばれ bは 虚 数 部 です いかなる 実 数 k( 普 通 の 数 ) も 複 素 数 (k,0)=k+0i として 表 現 することができます
9.4 159 複 素 数 は 式 9-1に 示 すように 加 算 減 算 乗 算 が 可 能 です 虚 数 部 の 符 号 を 反 転 することで 複 素 数 の 共 役 を 計 算 することもできます その 表 記 法 を 式 9-2 に 示 します 複 素 数 の 大 きさを 計 算 することができます この 演 算 の 表 記 法 と 解 釈 は 実 数 の 絶 対 値 に 似 てお り 実 際 実 数 を 複 素 数 として 表 現 したときには 同 じ 結 果 になります 式 9-3に 複 素 数 の 大 きさを 示 します 複 素 数 の 集 合 は 2D 平 面 上 に 存 在 しています この 平 面 を2 本 の 軸 を 持 つものとして 考 えること ができます 実 軸 と 虚 軸 です したがって 虚 数 (x,y) は2Dのベクトルとして 解 釈 できます 虚 数 がこのように 解 釈 されると それらを 使 って 平 面 内 での 回 転 を 実 行 することができます( 回 り 道 で はありますが) 虚 数 p は 図 9-9に 示 すように 原 点 の 周 りに 角 度 θだけ 回 転 します
160 9 章 3D における方向と角変位 図 9-9 平面内での虚数の回転 この回転を実行するために 第 2 の虚数 q (cosθ,sinθ) を定義します ここで 回転したベク トル p' は 虚数の乗算により計算できます もちろん これは 7.2.1 節の 2 2 の回転行列に過ぎません しかし虚数により 興味深い表記法 が提供されています 同じ方法で四元数を 3D で使えることがわかるでしょう アイルランドの数学者ウィリアム ハミルトンは 虚数を 2D から 3D に拡張する方法を何年も探 していました この新しい形式の虚数は 1 つの実数部と 2 つの虚数部を持っていると彼は考えてい ました しかしハミルトンは 2 つの虚数部を持つ有用な形式の虚数を作り出すことはできませんで した その後 物語は進み 1843 年 アイルランド王立アカデミーの講演に行く途中で 彼は突然 2 つではなく 3 つの虚数部が必要であることに気が付いたのです 彼は この新しい形式の複素数の 性質を定義する式を ブルーム橋に刻みました こうして 四元数は発明されたのです 四元数は 複素数系を 3 つの虚数 i j k を持つように拡張しています 3 つの虚数は以下のよう に関係しています 四元数 [w,(x,y,z)] は 複素数 w xi yj zk を定義します すぐにわかるように 標準の 複素数の多くの性質が四元数にも当てはまります 最も重要なことには 複素数を使って平面上の ベクトルを回転できるのと類似した方法で 四元数を使って 3D のベクトルを回転できるということ 3DGameBook.indb 160 08.9.3 3:59:31 PM
9.4 161 です 9.4.3 オイラーは 一 連 の 回 転 は 単 一 の 回 転 と 同 値 であることを 証 明 しました したがって 3Dの 任 意 の 角 変 位 は 単 一 の 軸 の 周 りの 単 一 の 回 転 として 表 現 することができます 方 向 をこの 形 式 で 表 現 するとき この 形 式 は 軸 角 度 (axis-angle) 表 現 として 知 られています 7.2.3 節 で 任 意 の 軸 の 周 りにベクトルを 回 転 する 行 列 を 導 き 出 しました そのときやったように 回 転 の 軸 となるベクトル n を 定 義 しましょう 現 時 点 では n は 単 位 長 を 持 つよう 制 限 しておくと 便 利 ですが 軸 を 定 義 するという 目 的 からは n の 長 さは 重 要 ではありません n の 向 きは 左 手 あるいは 右 手 の 座 標 空 間 にとって 標 準 的 な 方 の 手 の 法 則 に 従 って どちらを 正 の 回 転 と 見 なすかを 定 義 します(この 法 則 を 忘 れてしまっていたら 図 7-5を 見 てください) この 軸 の 周 りの 回 転 量 と して スカラーθも 定 義 します したがって (θ,n) は nにより 指 定 される 軸 の 周 りのθラジア ンの 回 転 として 角 変 位 を 定 義 します 四 元 数 は 角 変 位 の 軸 角 度 表 現 として 解 釈 することができます もちろん n とθを 単 純 に 四 元 数 の4つの 数 字 に 直 接 格 納 はしません それでは 簡 単 すぎます それらは 四 元 数 の 中 にはあります が それほど 単 純 明 快 ではありません 式 9-4は 四 元 数 q の 中 の 数 が どのようにθと n に 関 係 しているかを 示 しています 四 元 数 の 両 方 の 表 記 法 を 使 っています q の w 要 素 はθに 関 係 していますが 同 じものではないことを 覚 えておいてください 同 様 に v と n も 関 係 していますが 同 一 ではありません 9.4.4 四 元 数 は 符 号 反 転 することができます これは 各 要 素 を 符 号 反 転 するという 自 明 な 方 法 で 行 いま す 驚 くべきことに 四 元 数 q と q は 同 じ 角 変 位 を 表 現 していることがわかります θに 360 の ここでの 軸 という 言 葉 は 何 かがその 周 りを 回 転 する 直 線 という 一 般 的 な 意 味 で 使 われており 基 本 軸 と 混 同 しないでください 与 えられた 方 向 の 回 転 軸 は 任 意 の 方 向 を 向 いていることがかなり 多 いのです 実 際 軸 角 度 形 式 を 方 向 を 表 現 する 第 4 の 形 式 として 定 義 することもできました しかし 軸 角 度 形 式 は 実 際 には 滅 多 に 使 われません 普 通 は 代 わりに 四 元 数 かオイラー 角 が 使 われます
162 9 3D 倍 数 を 足 しても q によって 表 現 される 角 変 位 は 変 わりありませんが q の4つの 要 素 すべての 符 号 が 反 転 されます したがって いかなる3Dの 角 変 位 も 四 元 数 形 式 では 正 確 に2つの 異 なる 表 現 が あり それらは 互 いの 符 号 反 転 になっています 9.4.5 幾 何 学 的 には 無 の 角 変 位 を 表 現 する2つの 恒 等 四 元 数 が 存 在 します [1,0] と [ 1,0] です (ボールド 体 の 0 は ゼロベクトルを 表 すことに 注 意 ) θが 360 の 偶 数 倍 のとき cos(θ/2)=1 となり 前 者 の 形 式 になります θが 360 の 奇 数 倍 のときは cos(θ/2)= 1 となり 後 者 の 形 式 になります どちらの 場 合 も sin(θ/2)=0 なので n の 値 は 無 関 係 です これは 当 然 です 回 転 角 θが 完 全 に 何 周 した 数 であっても 方 向 には 実 際 の 変 化 はなく 回 転 の 軸 は 無 関 係 なのですから 数 学 的 には 1つの 恒 等 四 元 数 が 存 在 します [1,0] です いかなる 四 元 数 q に 恒 等 四 元 数 を 掛 けても 結 果 は q です( 四 元 数 の 乗 算 については 9.4.8 節 で 勉 強 します) 四 元 数 q に 別 の 幾 何 学 的 な 恒 等 四 元 数 [ 1,0] を 掛 けると q になります 幾 何 学 的 には q と q は 同 じ 角 変 位 を 表 現 するので この 結 果 は 同 じ 四 元 数 です 数 学 的 には q と q は 等 しくないので [ 1,0] は 真 の 恒 等 四 元 数 ではないのです 9.4.6 ベクトルや 複 素 数 と 同 様 に 四 元 数 の 大 きさも 計 算 することができます 表 記 法 と 式 を 式 9-6に 示 しますが ベクトルのものと 似 ています この 意 味 を 幾 何 学 的 に 見 てみましょう θと n を 使 って 置 き 換 えると 以 下 を 得 ます n は 単 位 長 であるという 制 限 を 思 い 出 してください それにより 次 の 式 を 得 ます
9.4 四元数 163 三角恒等式 sin2x cos2x 1 付録 A 参照 を適用すると 以下を得ます 四元数で方向を表現するという目的から このルールに従ういわゆる単位四元数だけを扱います 正規化されていない四元数に関する情報については 付録 C の [3] を参照してください 9.4.7 四元数の共役と逆数 四元数の共役は q* と表記され 四元数のベクトル部分を符号反転することで得られます 式 9-7 四元数の共役 四元数の逆数は q 1 と表記され 四元数の共役をその大きさで割ることで定義されます 式 9-8 四元数の逆数 四元数の逆数は 実数 スカラー の逆数と興味深い対応を見せています 実数では逆数 a 1 は 1/a です 言い換えれば a(a 1) a 1a 1 です 同じことが四元数にも当てはまります ある四 元数 q にその逆数 q 1 を掛けると 恒等四元数 [1,0] になります 四元数の乗算については次節で 説明します 式 9-8 は 四元数の逆数の公式な定義です しかし ここではその目的から単位四元数のみを使っ ているので 四元数の共役と逆数は同値です q と q* は逆の角変位を表現しているので 共役 逆数 は興味深いです なぜそうなるのかは簡単 です v を符号反転することにより回転軸 n を反転しており これは正の回転と見なす向きを逆に しています したがって q はある軸の周りにθだけ回転し q* は同じ量だけ逆の向きに回転する のです 3DGameBook.indb 163 08.9.3 3:59:35 PM
164 9 章 3D における方向と角変位 ここでの目的のためには 四元数の共役の別の定義として v および n は変えずに w を否定す ることも可能です これは 回転軸をひっくり返すことで何を正の回転と見なすかを逆転させる代わ りに 回転θの量を反転しています これは 式 9-8 で与えられる定義と同値 少なくともここでは であり 実装がわずかに高速になり また 幾何的解釈もわずかに直感的になります しかし 共役 という用語は 複素数の文脈では特別な意味を持っているので ここでは元の定義をそのまま使う ことにしました 9.4.8 四元数の乗算 外積 四元数は 9.4.2 節の複素数の解釈に従って乗算が可能です これにより 四元数の乗算の標準的な定義を導くことができます 式 9-9 に四元数の両方の表記 法を使って示します 式 9-9 四元数の積の標準的な定義 これは 私たちが本書で用いる四元数の乗算の定義ではありません 本書では少し異なる 形式を使います この代わりの定義 およびその論理的背景について 何ページか割きます 3DGameBook.indb 164 08.9.3 3:59:37 PM
9.4 四元数 165 本書では 四元数の外積には乗算記号を使いません また 行の四元数と列の四元数の間に違い はありません 四元数の乗算は結合可能ですが 交換可能ではありません 式 9-10 四元数の乗算は結合可能だが交換可能ではない 2 つの四元数の積の大きさを調べてみましょう この積を拡張して項を打ち消し このステップは とても乱雑なので割愛しました 因数に分解 すると 以下のようになります 最後に 四元数の大きさの定義を適用します 式 9-11 四元数の積の大きさは 大きさの積と等しい 3DGameBook.indb 165 08.9.3 3:59:41 PM
166 9 3D よって 四 元 数 の 積 の 大 きさは 大 きさの 積 に 等 しくなります これは 2つの 単 位 四 元 数 を 掛 け た 結 果 が 単 位 四 元 数 になるということで とても 意 味 のあることです 四 元 数 の 積 の 逆 数 は 順 序 を 逆 にした 逆 数 の 積 と 等 しくなります ここで 四 元 数 の 興 味 深 い 性 質 がわかります 標 準 的 な3Dの (x,y,z) の 点 を 四 元 数 p= [0,(x,y,z)] を 定 義 することで 四 元 数 空 間 に 展 開 しましょう(もちろん p は 一 般 には 単 位 四 元 数 でありません) q を 私 たちが 議 論 している 形 式 の 回 転 四 元 数 [cosθ/2,n sinθ/2] とします ここで n は 回 転 の 単 位 ベクトル 軸 で θは 回 転 角 です 驚 くべきことに 以 下 の 四 元 数 の 乗 算 を 実 行 することで 3Dの 点 p を n の 周 りに 回 転 させられることがわかります このことは 乗 算 を 展 開 し n とθに 置 き 換 え 結 果 を 式 7-5と 比 較 することで 証 明 できます 実 際 これが ほとんどの 四 元 数 のテキストで 用 いられている 四 元 数 から 行 列 形 式 への 変 換 を 導 き 出 す 方 法 です 私 たちは 四 元 数 から 行 列 形 式 への 変 換 を 回 転 の 幾 何 学 のみから 導 き 出 すことを 選 択 しました(これは9.6.3 節 で 行 います) 結 局 四 元 数 の 乗 算 と3Dベクトルの 回 転 との 間 の 対 応 は 実 用 的 というより 論 理 的 に 興 味 深 いのです 実 際 問 題 として 四 元 数 を(9.6.3 節 で 導 出 する 式 9-23 を 使 って) 行 列 形 式 に 変 換 して その 後 ベクトルにその 行 列 を 掛 けるのは 同 じくらいに 速 そうです このちょっとした 数 学 的 雑 学 の 他 に 四 元 数 の 乗 算 の 重 要 な 点 は 何 でしょうか? 複 数 の 回 転 を 適 用 すると 何 が 起 きるか 調 べてみましょう 点 pを 四 元 数 aにより 回 転 した 後 その 結 果 を 別 の 四 元 数 b により 回 転 します a で 回 転 した 後 b で 回 転 することは 四 元 数 の 積 ba で1 回 回 転 することと 同 値 であることに 注 意 してください したがって 行 列 の 乗 算 と 同 様 四 元 数 の 乗 算 を 使 って 複 数 の 回 転 を 連 結 するこ とができます 四 元 数 の 乗 算 の 標 準 の 定 義 に 従 うと これらの 回 転 は 右 から 左 の 順 で 起 こります これでは 複 数 の 回 転 をあべこべに 書 かなければならず 行 列 形 式 での 同 じ 演 算 と 一 致 していない( 少 なくとも 行 ベクトルが 使 われている 場 合 は)ので とても 不 幸 なことです 式 9-9に 起 因 するこの 後 進 性 の 理 由 から 本 書 と 筆 者 らのコードでは 標 準 の 定 義 からはずれ 逆 の 順 番 で 被 演 算 子 を 掛 ける 四 元 数 の 乗 算 を 定 義 します ベクトルの 外 積 の 部 分 しか 影 響 を 受 けな
9.4 167 いことに 注 意 してください この 定 義 でも 四 元 数 の 基 本 的 な 性 質 や θと n を 使 った 幾 何 学 的 な 解 釈 は 変 わりません 筆 者 らの 定 義 だけでも 四 元 数 の 乗 算 を 使 ってベクトルを 直 接 回 転 させられます 四 元 数 を 右 に 掛 け その 逆 数 を 左 に 掛 けるのです 複 数 の 回 転 の 連 結 を 表 現 する 積 は まさに 左 から 右 に 回 転 が 起 こる 順 番 に 読 むことができます 本 書 の 以 降 の 文 章 およびすべてのコードでは 上 記 の 式 9-13で 与 えられる 四 元 数 の 乗 算 の 定 義 を 用 います 混 乱 を 最 小 限 にするため この 標 準 からの 逸 脱 に 起 因 して 他 のテキストでの 式 やコー ドと 違 ってしまう 個 所 では 常 にそのことを 指 摘 します 筆 者 らは この 標 準 からの 逸 脱 を 軽 々しく 考 えてはいるわけではなく 非 常 に 妥 当 な 理 由 があって こうしました 10.3 節 で 四 元 数 クラスを 開 発 しますが そこでは 四 元 数 クラスのメンバを 直 接 扱 う 必 要 を 完 全 になくします 筆 者 らにとって 角 変 位 としての 四 元 数 の 高 度 な 能 力 の 使 いやすさは 公 的 標 準 に 固 執 することよりもずっと 重 要 なことなのです 最 終 的 な 目 的 は 四 元 数 の 本 質 と 使 用 可 能 な 演 算 を 理 解 し これらの 演 算 を 直 接 公 開 するクラスを 設 計 し これらの 演 算 を 通 じてクラスを 使 って もうクラス 内 部 の 数 値 をいじくりまわさなくてもよくすることなのです 9.4.9 四 元 数 の 乗 算 と 逆 数 を 使 って 2つの 四 元 数 の 間 の 差 分 を 計 算 することができます 差 分 は 1つ の 方 向 から 別 の 方 向 への 角 変 位 として 定 義 されます 言 い 換 えれば ある 所 定 の 方 向 a と b に 対 し て a から b に 回 転 する 角 変 位 d を 計 算 できるということです これは 以 下 の 四 元 数 の 等 式 を 使 ってコンパクトに 表 現 できます
168 9 3D ここでは 筆 者 らのより 直 感 的 な 四 元 数 の 乗 算 の 定 義 を 使 っています 回 転 の 順 番 は 乗 算 の 順 番 に 対 応 しており 左 から 右 です では d を 解 いてみましょう 式 内 の 変 数 がスカラーを 表 してい れば 単 純 に d で 割 ることができます しかし 四 元 数 は 掛 けることができるだけで 割 ることは できません おそらく 逆 数 を 掛 けることで 望 む 効 果 を 達 成 できるのではないでしょうか? 両 辺 の 左 に a 1 を 掛 けると 以 下 のようになります 四 元 数 の 乗 算 は 交 換 可 能 でないので 注 意 が 必 要 です 四 元 数 の 乗 算 の 結 合 可 能 な 性 質 を 適 用 して 単 純 化 すると 以 下 が 得 られます これで ある 方 向 から 他 の 方 向 への 角 変 位 を 表 現 する 四 元 数 を 生 成 する 方 法 が 得 られました こ れは 9.4.13 節 で 使 います 数 学 的 には 2つの 四 元 数 の 角 度 の 差 分 は 真 の 差 分 ( 減 算 )よりも 実 際 には 除 算 の 方 に 似 ています 9.4.10 四 元 数 に 対 する 内 積 の 演 算 が 定 義 されています この 演 算 の 表 記 と 定 義 は ベクトルの 内 積 と 非 常 によく 似 ています ベクトルの 内 積 と 同 様 結 果 がスカラーであることに 注 意 してください 単 位 四 元 数 a と b に 対 して 1 a b 1 です b と bは 同 じ 角 変 位 を 表 現 しているにもかかわらず a b= (a b) なので 通 常 は a b の 絶 対 値 だけを 興 味 の 対 象 とします 四 元 数 の 内 積 の 幾 何 学 的 な 解 釈 は ベクトルの 内 積 の 解 釈 と 似 ています すなわち 四 元 数 の 内 積 a b の 絶 対 値 が 大 きいほど a と b で 表 現 される 角 変 位 は 似 ているということです 9.4.11 log exp 本 節 では 直 接 使 われることは 滅 多 にないものの いくつかの 重 要 な 四 元 数 の 演 算 の 基 本 となる3 つの 演 算 について 説 明 します これらの 演 算 とは 四 元 数 の 対 数 指 数 およびスカラーによる 乗 算 です
9.4 169 う まず 角 度 の 半 分 θ/2と 等 しい 変 数 αを 導 入 することにより 四 元 数 の 定 義 を 再 公 式 化 しましょ ここで q の 対 数 は 式 9-15のように 定 義 されます の 表 記 は 定 義 により 等 しい ことを 意 味 しています log q の 結 果 は 一 般 には 単 位 四 元 数 で はないことに 注 意 してください 指 数 関 数 は まったく 反 対 の 方 法 で 定 義 されます まず 四 元 数 p を [0,αn] の 形 式 で 定 義 し ます n は 単 位 ベクトルです 指 数 関 数 は 式 9-16のように 定 義 されます 定 義 により exp p は 常 に 単 位 四 元 数 を 返 します 四 元 数 の 対 数 と 指 数 は スカラーのそれと 類 似 性 があります いかなるスカラー a に 対 しても 以 下 の 関 係 が 成 り 立 つことを 思 い 出 してください 同 様 に 四 元 数 の 指 数 関 数 は 四 元 数 の 対 数 関 数 の 逆 関 数 として 定 義 されます
170 9 3D 最 後 に 四 元 数 にはスカラーを 掛 けることができ その 結 果 は 各 要 素 にスカラーを 掛 けるという 自 明 な 方 法 で 計 算 されます 所 定 のスカラー kと 四 元 数 q において 式 9-17が 成 り 立 ちます 通 常 この 結 果 は 単 位 四 元 数 にはなりません それが スカラーによる 乗 算 が 角 変 位 を 表 現 す るというコンテキストではそれほど 有 用 な 演 算 でない 理 由 です 9.4.12 四 元 数 は 累 乗 (べき 乗 )することができます これは q t と 表 記 します これを 指 数 関 数 と 混 同 しな いでください 指 数 関 数 は 1つの 四 元 数 の 引 数 しか 取 りません 四 元 数 の 累 乗 は2つのパラメータ ( 四 元 数 と 指 数 )を 取 ります 四 元 数 の 累 乗 は 実 数 を 累 乗 したときの 結 果 と 似 ています a が 非 0のスカラーのとき a 0 =1 で a 1 =a であることを 思 い 出 してください t が 0... 1 の 間 を 変 化 するとき a t は 1... a の 間 を 変 化 します 同 様 の 命 題 が 四 元 数 の 累 乗 でも 保 持 されます すなわち t が 0... 1 の 間 を 変 化 するとき q t は [1,0]... q の 間 を 変 化 します 四 元 数 の 累 乗 は 角 変 位 のフラクション( 割 合 )を 抽 出 することができるので 便 利 です 例 えば 四 元 数 q で 表 現 される 角 変 位 の 1/3 を 表 現 する 四 元 数 を 計 算 するには q 1/3 を 計 算 します 0... 1 の 範 囲 外 の 指 数 は ほとんど 予 想 どおりの 振 る 舞 いをします(ただし 1つの 重 要 な 警 告 が あります) 例 えば q 2 は q の 角 変 位 の2 倍 を 表 現 します q が x 軸 の 周 りの 時 計 回 り 30 の 回 転 を 表 現 していたら q 2 は x 軸 の 周 りの 時 計 回 り 60 の 回 転 を 表 し q 1/3 は x 軸 の 周 りの 反 時 計 回 り 10 の 回 転 を 表 します 上 述 した 警 告 とはこうです 四 元 数 は 最 短 の 弧 を 使 って 角 変 位 を 表 現 しています 複 数 回 の 回 転 は 表 現 できません 上 記 の 例 を 続 けると q 8 は 予 想 される x 軸 の 周 りの 時 計 周 り 240 の 回 転 ではなく 反 時 計 回 り 120 の 回 転 です もちろんある 向 きへ 240 回 転 することは 逆 向 きへ 120 することと 同 じなので 正 しい 最 終 結 果 は 適 切 に 得 られます しかし この 四 元 数 にさらに 演 算 を 実 行 すると 予 想 どおりの 振 る 舞 いをしないことがあります 例 えば (q 8 ) 1/2 は 直 感 的 に 予 想 される q 4 ではありません 一 般 的 に (a s ) t =a st のような スカラーの 累 乗 に 関 する 多 くの 代 数 恒 等 式 は 四 元 数 には 当 てはまりません さてこれで 四 元 数 の 累 乗 を 何 に 使 うかを 理 解 できたので それが 数 学 的 にどのように 定 義 され るかを 見 ましょう 四 元 数 の 累 乗 は 前 節 で 学 習 したユーティリティ 演 算 を 使 って 定 義 されます そ の 定 義 は 式 9-18によって 与 えられます
9.4 171 スカラーの 累 乗 に 関 しても 同 様 の 命 題 が 成 り 立 つことに 注 意 してください なぜ t が 0...1 の 範 囲 を 変 化 する 間 に q t が 恒 等 四 元 数 から q までを 補 間 するかを 理 解 するの はそれほど 難 しくはありません log 演 算 が 基 本 的 に 軸 n と 角 度 θを 抽 出 することに 注 意 してくださ い その 後 指 数 t でスカラーの 乗 算 を 実 行 すると その 効 果 は 単 にθを t 倍 するだけです 最 後 に expでlog 演 算 がしたことを 取 り 消 し 新 しい w と v を tθ と n から 再 計 算 します したがって 上 記 で 与 えられた 定 義 は 公 式 な 数 学 的 なものであり 理 論 的 に 優 雅 に 機 能 しますが これをコード に 直 接 翻 訳 することは 必 要 以 上 に 複 雑 です リスト9-1に q t の 値 をどう 計 算 できるかを 示 します // float w,x,y,z; // float exponent; // // 0 if (fabs(w) <.9999f) { // alpha (alpha = theta/2) float alpha = acos(w); // alpha float newalpha = alpha * exponent; // w w = cos(newalpha); // xyz } float mult = sin(newalpha) / sin(alpha); x *= mult; y *= mult; z *= mult; このコードについて いくつか 注 目 すべき 点 があります