プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース 第8回 ゲームで使えるベクトル演算
今日の資料構成 ベクトルの基礎についてはPDFを参照 それをゲーム的にどう使うかをPPTで解説
今日の知識でできること ベクトルが表しているものの区別 距離による判定 角度による判定 真横の方向をゲットできる
ごっちゃにしてませんか? ベクトルは時と場合によって、 「座標」を表したり「方向」を表したり「移動量」を表したりと、 その意味合いが変化します fk_Modelのメンバ関数もごっちゃになる人が多いので、もう一度整理しましょう
fk_Modelで扱う ベクトルのセマンティクス一覧表 セマンティクスとは 「意味」をかっこよく言った表現 とりあえずグローバル座標版のみ ローカル座標はまた後ほど getVec()、getUpvec()で得られる方向ベクトルは 常に長さが1である 正規化済み 関数名 動作 得る物・与える物 getPosition() 取得 座標 getVec() 方向 getUpvec() getVec()との垂直方向 glRotate() 設定 軸を通る座標 …withVec() 軸を構成する座標 glTranslate() 移動量付きの方向 glMoveTo() glFocus() 注視する座標 glVec() glUpvec() glVec()との垂直方向
セマンティクスごとの ベクトル演算結果一覧表 今回の資料と合わせてよく確認しておくこと 位置+位置はありえない ただし、tA+(1-t)Bの形式で表した式は線分上の任意の点を表す これは次回以降取り扱う 計算式 得られる物 位置+位置 Perdon? 位置Aー位置B BからAへの方向 位置A+方向B AからB進んだ位置 位置Aー方向B AからB戻った位置 方向A+方向B 合成された方向 方向Aー方向B 位置*実数 方向*実数 長さを実数倍した方向
距離判定 もはや言うまでもあるまい 位置Aー位置Bで得られたベクトルの長さを求めて、条件判定に利用できる fk_Vectorではdist()関数が利用できる fk_Vector vecAB = posB – posA; double distance = vecAB.dist(); こんな裏技もあるよ (posB-posA).dist();
角度判定 プレイヤーモデルの位置(posP)と、 敵モデルの位置(posE)と方向(vecE)から 「一定の角度内にプレイヤーが入ると追いかけてくる敵の動き」が実現できる 敵モデルから見たプレイヤーモデルへの方向を求める(vecEP = posP-posE) それを正規化して(vecEP.normalize())、 vecEとの内積を取る 得られたcosθの値を使って条件判定
外積の使い方 前述した角度判定の結果が「左右どっち側に何度なのか」を調べるのに利用 真横の方向をゲット 実演します glVec()^glUpvec()で右方向のベクトルが 得られる
今日の課題 一定距離内に一定の角度で近づいた場合、 プレイヤーモデル(キー操作可能なモデル)を追跡してくる動きを実現せよ