プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作

Slides:



Advertisements
Similar presentations
Absolute Orientation. Absolute Orientation の問題 二つの座標系の間における剛体 (rigid body) 変換を復元す る問題である。 例えば: 2 台のステレオカメラから得られた3次元情報の間の関 係を推定する問題。 2 台のステレオカメラから得られた3次元情報の間の関.
Advertisements

MicroAVS 超入門 赤塚浩太. MicroAVS とは Visualization Tool Excel Java 膨大,高度なデータ処理が困難 高度なプログラミング能力必要 誰でも簡単に可視化できるツールの必要性 Micro AVS.
0章 数学基礎.
計測情報処理論(4) レンズの基礎.
ロボットシミュレーション ODE Dynamics Engineによるロボットプログラミング
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
パノラマ動画像モデルによる 仮想空間表現システムの研究
CGアニメーションの原理 基本技術 対象物体の動きや変形の設定方法 レンダリング技術
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
形状を平行移動や回転移動させて位置を変えたり,拡大・縮小して変形させる方法を説明する.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
プロジェクト演習Ⅱ インタラクティブゲーム制作
多変数関数の積分(6/3~24) 重積分(2重積分) 第6章(§5は除く) 重積分の定義 「連続関数は積分可能」
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
高山建志 五十嵐健夫 テクスチャ合成の新たな応用と展開 k 情報処理 vol.53 No.6 June 2012 pp
(ラプラス変換の復習) 教科書には相当する章はない
第5回 統計処理(2) 塩浦 昭義 東北大学全学教育科目 情報基礎 A 1セメスター 木曜1,3講時 経済学部・法学部
3次元での回転表示について.
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
3D散歩ゲーム 08A2043 谷口盛海 種田研究室.
Computer Graphics 第3回 座標変換 芝浦工業大学情報工学科 青木 義満
CGと形状モデリング 授業資料 長井 超慧(東京大学)
OpenGLライブラリを用いた3次元フラクタルの描画
2a グラフの用法.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
5章  3次元形状を2次元面に投影する 3次元空間内に定義した形状を,2次元面上(ディスプレイのスクリーン面,プリンタの紙面など)に投影して表示するために必要になる変換について説明する.
6. ラプラス変換.
3次元での回転表示について.
実物投影機の使い方 その① テレビにつないでみよう。.
知能システム論I(13) 行列の演算と応用(Matrix) 2008.7.8.
予測に用いる数学 2004/05/07 ide.
デジタル画像とC言語.
主成分分析 Principal Component Analysis PCA
Minoのブロック配置のデータ構造 K.Yonezawa.
CAD曲面 東京大学 精密工学専攻 大竹豊 資料および授業の情報は :
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
動力学(Dynamics) 力と運動方程式 2008.6.10
変換されても変換されない頑固ベクトル どうしたら頑固になれるか 頑固なベクトルは何に使える?
プロジェクト演習Ⅱ インタラクティブゲーム制作
SURF+BoFによる特定物体認識 卒業研究1 1 11/27/11.
建築模型制作支援のための ソフトウェア研究開発
部分的最小二乗回帰 Partial Least Squares Regression PLS
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
速度ポテンシャルと 流線関数を ベクトルで理解する方法
Fourier 変換 Mellin変換 演習課題
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
資料 線型変換のイメージ 固有値、固有ベクトル 平賀譲(209研究室) 資料
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
逆運動学:手首自由度 運動学:速度、ャコビアン 2008.5.27
わかりやすいパターン認識 第7章:部分空間法  7.1 部分空間法の基本  7.2 CLAFIC法                  6月13日(金)                  大城 亜里沙.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
第9章 学習アルゴリズムとベイズ決定側 〔3〕最小2乗法とベイズ決定側 発表:2003年7月4日 時田 陽一
EastNipporiFactory(東日暮里工房)
アルゴリズムとプログラミング (Algorithms and Programming)
地理情報システム論(総)/ 国民経済計算論(商)
地理情報システム論 第4回 コンピュータシステムおける データ表現(2)
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
大阪工業大学 情報科学部 情報システム学科 学生番号 B02-014 伊藤 誠
目で見る一次変換 河合塾 数学科 生越茂樹 オゴセ シゲキ.
関数教育における数式処理 電卓の短期利用とその効果
わかりやすいパターン認識 第6章 特徴空間の変換 6.5 KL展開の適用法 〔1〕 KL展開と線形判別法 〔2〕 KL展開と学習パターン数
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
Fourier 変換 Mellin変換 演習課題
逆運動学(Inverse Kinematics) 2007.5.15
Presentation transcript:

プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第7回 クォータニオンの使い方 ~恐るべき1/4たまねぎの威力~

今日の内容 3DCGの根元 四元数(クォータニオン)の使い方 全てを握る行列 オイラー角の真実 数学的な立式や証明は極力排除 回転について考える 四元数(クォータニオン)の使い方 数学的な立式や証明は極力排除 ゲームに使える部分を可能な限り厳選

まずは3DCGの根元からおさらい 平行移動行列×回転行列×拡大縮小行列 全てのモデルやカメラは、4×4の行列によって「位置、姿勢、スケール」を保持している Direct3DもOpenGLも原理は同じ fk_Modelは自動的に変換してくれている OpenGLとDirect3Dでは乗算順が逆になるので注意 平行移動行列×回転行列×拡大縮小行列

それぞれの行列の作り方 平行移動 拡大縮小 回転行列 座標値を所定の位置にセットするだけ getPosition()の値 各軸の倍率を所定の 位置にセットするだけ getScale()の値 回転行列 一番面倒 最終的にはオイラー角の値を3つの回転行列に分割し、一定の順番で乗算することで作成 getAngle()の値を以下の順番で適用する Y軸中心に-h度回転 X軸中心にp度回転 Z軸中心に-b回転

オイラー角の罠 基礎演習で教えているオイラー角についての説明は「ウソではないが大事なことをかなり端折っている」と言える どの順番で、どういう法則で適用するのか、という情報が無いと意味がない ジンバルロックの危険性 2軸が重なり姿勢制御ができなくなる現象 定点的な姿勢を表現するのには問題ないが、連続的な回転を表現すると問題が起きやすい

オイラー角以外の 姿勢・回転制御方法 最終的にはオイラー角に直さなくてはならないが、途中の計算に異なる形式を用いることでフォローが可能 方向ベクトル&アップベクトル 真正面の向きと、頭の向きを指定する姿勢表現 直感的で良いが、回転を表すのには不向き ベクトルを合成すると零ベクトルになる可能性がある axis-angle 任意の軸を中心に何度回転しろ、という操作 あくまで回転表現なので、姿勢表現には不向き その代わりジンバルロックは起きない glRotateWithVec()で実現可能

意味がわかんねぇ! そこで、クォータニオン 姿勢、回転のどちらも表すことができる 補間計算が容易で強力 唯一の難点は… ジンバルロックも心配ない 唯一の難点は… 意味がわかんねぇ!

クォータニオンの正体とは 以下の数式で表される複素数 ベクトルやオイラー角と違い、各成分の値に直接的な意味を見いだすことは困難 fk_Quaternionクラスを利用することを推奨 Direct3Dでも無理矢理部分的に併用しよう

2つの姿勢の補間姿勢を求める 多分一番よく使う利用方法 オイラー角で表された姿勢Aと姿勢Bの 線形補間(E=(1.0-t)A+tB)を行いたい オイラー角で直接この計算を行うと悲惨な ことになる クォータニオンを通すことで安全確実な変換ができる

コーディング例 // angA, angBには姿勢がセットされるとする fk_Angle angA, angB, angRes; fk_Quaternion qA, qB, qAns; double t = 0.5; // 任意の補間パラメータを指定 // オイラー角をそれぞれクォータニオンに変換 qA.makeEuler(angA); qB.makeEuler(angB); // 球面線形補間を使って補間クォータニオンを算出 qAns = fk_Math::quatInterSphere(qA, qB, t); // 補間したクォータニオンをオイラー角に変換 angRes = qAns.getEuler();

解説 makeEuler()でオイラー角→Q変換 getEuler()でQ→オイラー角変換 fk_Math::quatInterSphere() fk_Mathクラスのstaticメンバ関数 staticメンバとは、クラスのインスタンスを作らなくても利用できる関数 関数単体で機能する物はよくstatic化される

回転合成とベクトルの回転 こちらの利用方法も便利なので覚えよう setRotate(角度, x, y, z) 回転軸と角度を指定して、その回転を表す クォータニオンを作成する これのおかげでset()の出番はまず無い

回転合成は乗算で qAB = qA*qB; で実現可能 乗算の順序を入れ替えてしまうと意味合いが変わってしまうので注意 Aの回転後Bの回転を行うのと、 Bの回転後Aの回転を行うのでは異なる結果になる FKのオイラー角は以下の処理で変換できる (makeEuler()で実際に同じ処理をしている) qH.setRotate(-euler.h, 0, 1, 0); qP.setRotate(euler.p, 1, 0, 0); qB.setRotate(-euler.b, 0, 0, 1); qHPB = qH * qP * qB;

あるベクトルを 自由に回転させるには まずは好きな回転を表すQを作る その上で、以下の処理を呼べば終了 用途は色々考えられる vAfter = qRot * vBefore; 用途は色々考えられる 射撃武器による銃口補正や誘導補正 キャラやカメラをある地点に徐々に向ける モーションの合成(ちょっと高度だけど)

まとめ 3次元の回転表現は色々あり、 状況に応じて使い分けが必要 クォータニオンを用いることで、 補間や合成が容易になり、夢が広がる 最終的にはオイラー角に落とし込むが、 色々問題が多い クォータニオンを用いることで、 補間や合成が容易になり、夢が広がる 回転の合成(Q同士の乗算) オイラー角の補間(Q同士の合成) ベクトルの回転(Qとベクトルの乗算)