100 likes | 231 Views
プロジェクト演習 III,V <インタラクティブ・ゲーム制作> プログラミングコース. 第 8 回 ゲームで使えるベクトル演算. 今日の資料構成. ベクトルの基礎については PDF を参照 それをゲーム的にどう使うかを PPT で解説. 今日の知識でできること. ベクトルが表しているものの区別 距離による判定 角度による判定 真横の方向をゲットできる. ごっちゃにしてませんか?. ベクトルは時と場合によって、 「座標」を表したり「方向」を表したり「移動量」を表したりと、 その意味合いが変化します
E N D
プロジェクト演習III,V<インタラクティブ・ゲーム制作>プログラミングコースプロジェクト演習III,V<インタラクティブ・ゲーム制作>プログラミングコース 第8回 ゲームで使えるベクトル演算
今日の資料構成 • ベクトルの基礎についてはPDFを参照 • それをゲーム的にどう使うかをPPTで解説
今日の知識でできること • ベクトルが表しているものの区別 • 距離による判定 • 角度による判定 • 真横の方向をゲットできる
ごっちゃにしてませんか? • ベクトルは時と場合によって、「座標」を表したり「方向」を表したり「移動量」を表したりと、その意味合いが変化します • fk_Modelのメンバ関数もごっちゃになる人が多いので、もう一度整理しましょう
fk_Modelで扱うベクトルのセマンティクス一覧表fk_Modelで扱うベクトルのセマンティクス一覧表 • セマンティクスとは • 「意味」をかっこよく言った表現 • とりあえずグローバル座標版のみ • ローカル座標はまた後ほど • getVec()、getUpvec()で得られる方向ベクトルは常に長さが1である • 正規化済み
セマンティクスごとのベクトル演算結果一覧表セマンティクスごとのベクトル演算結果一覧表 • 今回の資料と合わせてよく確認しておくこと • 位置+位置はありえない • ただし、tA+(1-t)Bの形式で表した式は線分上の任意の点を表す • これは次回以降取り扱う
距離判定 • もはや言うまでもあるまい • 位置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()で右方向のベクトルが得られる
今日の課題 • 一定距離内に一定の角度で近づいた場合、プレイヤーモデル(キー操作可能なモデル)を追跡してくる動きを実現せよ