プロジェクト演習 iii,v <インタラクティブ・ゲーム制作>...

12
ププププププププ III,V ププププププププ プププププ ププププププププププ プ8プ プププププププププププププ

Upload: neith

Post on 04-Jan-2016

61 views

Category:

Documents


0 download

DESCRIPTION

プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース. 第 8 回 ゲームで使えるベクトル演算. 今日の資料構成. ベクトルの基礎については PDF を参照 それをゲーム的にどう使うかを PPT で解説. 今日の知識でできること. ベクトルが表しているものの区別 距離による判定 角度による判定 真横の方向をゲットできる. まず押さえたいこと. ベクトルの演算規則 スカラー積・和・差 長さ ( ノルム ) 内積 外積 射影 これ はちょっと上級編 三角 関数の存在 さすったりこすったりは要りません. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

プロジェクト演習 III,V<インタラクティブ・ゲーム制作>

プログラミングコース

第 8回ゲームで使えるベクトル演算

Page 2: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

今日の資料構成

• ベクトルの基礎については PDFを参照• それをゲーム的にどう使うかを PPTで解説

Page 3: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

今日の知識でできること

• ベクトルが表しているものの区別

• 距離による判定• 角度による判定

• 真横の方向をゲットできる

Page 4: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

まず押さえたいこと

• ベクトルの演算規則– スカラー積・和・差– 長さ (ノルム )– 内積– 外積

– 射影• これはちょっと上級編

• 三角関数の存在– さすったりこすったりは要りません

Page 5: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

ごっちゃにしてませんか?

• ベクトルは時と場合によって、「座標」を表したり「方向」を表したり「移動量」を表したりと、その意味合いが変化します

• fk_Modelのメンバ関数もごっちゃになる人が多いので、もう一度整理しましょう

Page 6: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

fk_Modelで扱うベクトルの意味一覧表

• とりあえずグローバル座標版のみ– ローカル座標はまた後ほど

• getVec()、 getUpvec()で得られる方向ベクトルは常に長さが 1である– 正規化済み

• 方向が重要なので長さは無意味

関数名 動作 得る物・与える物getPosition() 取得 座標getVec() 取得 方向 (モデルの -z方

向 )getUpvec() 取得 getVec()との垂直方向

(モデルの +y方向 )glRotate() 設定 軸を通る座標glRotatewithVec() 設定 軸を構成する座標glTranslate() 設定 移動量付きの方向glMoveTo() 設定 座標glFocus() 設定 注視する座標glVec() 設定 方向glUpvec() 設定 glVec()との垂直方向

Page 7: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

意味ごとのベクトル演算結果一覧表

• 今回の資料と合わせてよく確認しておくこと

• 位置+位置はありえない– ただし、 tA+(1-t)Bの形式で表した式は線分上の任意の点を表す

– これは次回以降取り扱う

計算式 得られる物

位置+位置 Perdon?

位置 A-位置 B Bから Aへの方向

位置 A+方向 B Aから B進んだ位置

位置 A-方向 B Aから B戻った位置

方向 A+方向 B 合成された方向

方向 A-方向 B 合成された方向

位置*実数 Perdon?

方向*実数 長さを実数倍した方向

Page 8: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

ローカル座標版について

• ローカル座標とは– モデルのいる位置を原点とし、モデルに取っての前方向を(0,0,-1)、上方向を(0,1,0)とする座標系

– 神の手が「動かす」のではなく、自分で「動く」処理を行う際に便利

関数名 動作 得る物・与える物loRotate 設定 軸を通る L座標loRotateWithVec() 設定 軸を構成する L座標loTranslate() 設定 L座標系での移動量loFocus() 設定 L座標系で (0,0,-1)に

したい方向loUpvec() 設定 L座標系で (0,1,0)に

したい方向

Page 9: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

距離判定

• もはや言うまでもあるまい• 位置 Aー位置 Bで得られたベクトルの長さを求めて、条件判定に利用できる

• fk_Vectorでは dist()関数が利用できる– fk_Vector vecAB = posB – posA;– double distance = vecAB.dist();–こんな裏技もあるよ• (posB-posA).dist();

Page 10: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

角度判定

• プレイヤーモデルの位置 (posP)と、敵モデルの位置 (posE)と方向 (vecE)から「一定の角度内にプレイヤーが入ると追いかけてくる敵の動き」が実現できる–敵モデルから見たプレイヤーモデルへの方向を求める (vecEP = posP-posE)

–それを正規化して (vecEP.normalize())、vecEとの内積を取る

–得られた cosθの値を使って条件判定

Page 11: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

外積の使い方

• 前述した角度判定の結果が「左右どっち側に何度なのか」を調べるのに利用–実演します

• 真横の方向をゲット– glVec()^glUpvec()で右方向のベクトルが得られる

Page 12: プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース

今日の課題

• 一定距離内に一定の角度で近づいた場合、

プレイヤーモデル (キー操作可能なモデル )を追跡してくる動きを実現しよう

• 上下左右キーによる移動方向がカメラの向きと連動するようにしてみよう