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

Slides:



Advertisements
Similar presentations
シミュレーション演習 G. 総合演習 ( Mathematica 演 習) システム創成情報工学科 テキスト作成: 藤尾 光彦 講義担当: 尾下 真樹.
Advertisements

Absolute Orientation. Absolute Orientation の問題 二つの座標系の間における剛体 (rigid body) 変換を復元す る問題である。 例えば: 2 台のステレオカメラから得られた3次元情報の間の関 係を推定する問題。 2 台のステレオカメラから得られた3次元情報の間の関.
ファーストイヤー・セミナーⅡ 第13回 2次元グラフィックス(1). 2次元グラフィックス Ultra-C では、これまで利用してきた「標準入出力」 以外に「グラフィックス画面」があり、図形などを 表示できる C 言語のグラフィックスには細かな規定がなく、こ れから学ぶ内容が他の環境、システムでは利用でき.
MicroAVS 超入門 赤塚浩太. MicroAVS とは Visualization Tool Excel Java 膨大,高度なデータ処理が困難 高度なプログラミング能力必要 誰でも簡単に可視化できるツールの必要性 Micro AVS.
0章 数学基礎.
ロボットシミュレーション ODE Dynamics Engineによるロボットプログラミング
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
プログラミング演習3 李 亜民クラス 第2回 ラスタライズ.
パノラマ動画像モデルによる 仮想空間表現システムの研究
今日の内容 前回の復習 前回の演習の復習 視点操作の実現方法(復習) 視点操作の拡張 変換行列によるアニメーション 演習課題.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
平成23年8月 情報学群 岡田 守 このスライドは, 前川佳徳編著による「コンピュータグラフィックス」(オーム社)を基に作成されている.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
プロジェクト演習Ⅱ インタラクティブゲーム制作
多変数関数の積分(6/3~24) 重積分(2重積分) 第6章(§5は除く) 重積分の定義 「連続関数は積分可能」
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
高山建志 五十嵐健夫 テクスチャ合成の新たな応用と展開 k 情報処理 vol.53 No.6 June 2012 pp
(ラプラス変換の復習) 教科書には相当する章はない
3次元での回転表示について.
動力学(Dynamics) 運動方程式のまとめ 2008.6.17
シミュレーション演習 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研究室) 資料
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
わかりやすいパターン認識 第7章:部分空間法  7.1 部分空間法の基本  7.2 CLAFIC法                  6月13日(金)                  大城 亜里沙.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
地理情報システム論(総)/ 国民経済計算論(商)
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
第9章 学習アルゴリズムとベイズ決定側 〔3〕最小2乗法とベイズ決定側 発表:2003年7月4日 時田 陽一
地理情報システム論(総)/ 国民経済計算論(商)
地理情報システム論 第4回 コンピュータシステムおける データ表現(2)
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
大阪工業大学 情報科学部 情報システム学科 学生番号 B02-014 伊藤 誠
目で見る一次変換 河合塾 数学科 生越茂樹 オゴセ シゲキ.
指令1 三角形の謎にせまれ!.
わかりやすいパターン認識 第6章 特徴空間の変換 6.5 KL展開の適用法 〔1〕 KL展開と線形判別法 〔2〕 KL展開と学習パターン数
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
Fourier 変換 Mellin変換 演習課題
逆運動学(Inverse Kinematics) 2007.5.15
Presentation transcript:

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

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

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

描画モデル以外に必要な行列 View行列 Projection行列 世界の全てを、視点の位置と方向を基準に変換する行列 モデル行列と内容は同じ(演算時には逆行列化して用いる) FKではfk_Modelの変数をfk_Sceneにエントリーして設定 XNAではEffectsに 個別設定 Projection行列 視点から見た風景を 2次元に畳み込む行列 近くの物は大きく、遠くの物は小さくなる FKではデフォルトの行列が設定済み 変更したい場合はfk_Sceneで設定 XNAではEffectsに 個別設定

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

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

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

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

クォータニオンの正体とは 以下の数式で表される複素数 ベクトルやオイラー角と違い、各成分の値に直接的な意味を見いだすことは困難 fk_Quaternionクラスを利用することを推奨 XNAにも標準で存在するので使ってみよう

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とベクトルの乗算)

今日の課題 OBBのサンプルシーンで以下のような 処理を作ってみよう ロックオンポイントを3カ所作る ボタンを押す事に操作キャラがロックオンしている対象が切り替わる 操作キャラがロックオンポイントへ「滑らかに」向くようにする