120 likes | 265 Views
プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース. 第 8 回 ゲームで使えるベクトル演算. 今日の資料構成. ベクトルの基礎については PDF を参照 それをゲーム的にどう使うかを PPT で解説. 今日の知識でできること. ベクトルが表しているものの区別 距離による判定 角度による判定 真横の方向をゲットできる. まず押さえたいこと. ベクトルの演算規則 スカラー積・和・差 長さ ( ノルム ) 内積 外積 射影 これ はちょっと上級編 三角 関数の存在 さすったりこすったりは要りません.
E N D
プロジェクト演習III,V<インタラクティブ・ゲーム制作>プログラミングコースプロジェクト演習III,V<インタラクティブ・ゲーム制作>プログラミングコース 第8回 ゲームで使えるベクトル演算
今日の資料構成 • ベクトルの基礎についてはPDFを参照 • それをゲーム的にどう使うかをPPTで解説
今日の知識でできること • ベクトルが表しているものの区別 • 距離による判定 • 角度による判定 • 真横の方向をゲットできる
まず押さえたいこと • ベクトルの演算規則 • スカラー積・和・差 • 長さ(ノルム) • 内積 • 外積 • 射影 • これはちょっと上級編 • 三角関数の存在 • さすったりこすったりは要りません
ごっちゃにしてませんか? • ベクトルは時と場合によって、「座標」を表したり「方向」を表したり「移動量」を表したりと、その意味合いが変化します • fk_Modelのメンバ関数もごっちゃになる人が多いので、もう一度整理しましょう
fk_Modelで扱うベクトルの意味一覧表 • とりあえずグローバル座標版のみ • ローカル座標はまた後ほど • getVec()、getUpvec()で得られる方向ベクトルは常に長さが1である • 正規化済み • 方向が重要なので長さは無意味
意味ごとのベクトル演算結果一覧表 • 今回の資料と合わせてよく確認しておくこと • 位置+位置はありえない • ただし、tA+(1-t)Bの形式で表した式は線分上の任意の点を表す • これは次回以降取り扱う
ローカル座標版について • ローカル座標とは • モデルのいる位置を原点とし、モデルに取っての前方向を(0,0,-1)、上方向を(0,1,0)とする座標系 • 神の手が「動かす」のではなく、自分で「動く」処理を行う際に便利
距離判定 • もはや言うまでもあるまい • 位置Aー位置Bで得られたベクトルの長さを求めて、条件判定に利用できる • fk_Vectorではdist()関数が利用できる • fk_VectorvecAB = posB – posA; • double distance = vecAB.dist(); • こんな裏技もあるよ • (posB-posA).dist();
角度判定 • プレイヤーモデルの位置(posP)と、敵モデルの位置(posE)と方向(vecE)から「一定の角度内にプレイヤーが入ると追いかけてくる敵の動き」が実現できる • 敵モデルから見たプレイヤーモデルへの方向を求める(vecEP = posP-posE) • それを正規化して(vecEP.normalize())、vecEとの内積を取る • 得られたcosθの値を使って条件判定
外積の使い方 • 前述した角度判定の結果が「左右どっち側に何度なのか」を調べるのに利用 • 実演します • 真横の方向をゲット • glVec()^glUpvec()で右方向のベクトルが得られる
今日の課題 • 一定距離内に一定の角度で近づいた場合、プレイヤーモデル(キー操作可能なモデル)を追跡してくる動きを実現しよう • 上下左右キーによる移動方向がカメラの向きと連動するようにしてみよう