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

プロジェクト演習III,V
<インタラクティブ・ゲーム制作>
プログラミングコース
第8回
ゲームで使えるベクトル演算
今日の資料構成
• ベクトルの基礎についてはPDFを参照
• それをゲーム的にどう使うかをPPTで解説
今日の知識でできること
• ベクトルが表しているものの区別
• 距離による判定
• 角度による判定
• 真横の方向をゲットできる
まず押さえたいこと
• ベクトルの演算規則
–
–
–
–
スカラー積・和・差
長さ(ノルム)
内積
外積
– 射影
• これはちょっと上級編
• 三角関数の存在
– さすったりこすったりは要りません
ごっちゃにしてませんか?
• ベクトルは時と場合によって、
「座標」を表したり「方向」を表したり
「移動量」を表したりと、
その意味合いが変化します
• fk_Modelのメンバ関数もごっちゃになる
人が多いので、もう一度整理しましょう
fk_Modelで扱う
ベクトルの意味一覧表
• とりあえずグローバ
ル座標版のみ
– ローカル座標はまた
後ほど
• getVec()、
getUpvec()で得ら
れる方向ベクトルは
常に長さが1である
– 正規化済み
• 方向が重要なので
長さは無意味
関数名
動作
得る物・与える物
getPosition()
取得 座標
getVec()
取得 方向(モデルの-z方向)
getUpvec()
取得 getVec()との垂直方向
(モデルの+y方向)
glRotate()
設定 軸を通る座標
glRotatewithVec() 設定 軸を構成する座標
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?
方向*実数
長さを実数倍した
方向
ローカル座標版について
• ローカル座標とは
– モデルのいる位置を
原点とし、モデルに
取っての前方向を
(0,0,-1)、上方向を
(0,1,0)とする座標系
– 神の手が「動かす」
のではなく、自分で
「動く」処理を行う
際に便利
関数名
loRotate
動作
得る物・与える物
設定 軸を通るL座標
loRotateWithVec() 設定 軸を構成するL座標
loTranslate()
設定 L座標系での移動量
loFocus()
設定 L座標系で(0,0,-1)に
したい方向
loUpvec()
設定 L座標系で(0,1,0)に
したい方向
距離判定
• もはや言うまでもあるまい
• 位置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()で右方向のベクトルが
得られる
今日の課題
• 一定距離内に一定の角度で近づいた場合、
プレイヤーモデル(キー操作可能なモデル)
を追跡してくる動きを実現しよう
• 上下左右キーによる移動方向がカメラの
向きと連動するようにしてみよう