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

プロジェクト演習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
合成された方向
位置*実数
Perdon?
方向*実数
長さを実数倍した
方向
距離判定
• もはや言うまでもあるまい
• 位置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()で右方向のベクトルが
得られる
今日の課題
• 一定距離内に一定の角度で近づいた場合、
プレイヤーモデル(キー操作可能なモデル)
を追跡してくる動きを実現せよ