スライド 1

プロジェクト演習Ⅱ
インタラクティブゲーム制作
イントロダクション2
第6回
はじめての3Dプログラミング
跳んでぶつかり乗っかって編
今日の内容
• ジャンプと当たり判定の融合
– 複雑化してくるけど頑張ろう
• その他細かいところ
今週のプロジェクト
• 授業資料ページからダウンロードします
– 落としたZipファイルを解凍して、
出てきたフォルダを好きなところに配置
今日のサンプル
• ブロックがいっぱい出ます
• それにぶつかれます
• ジャンプしてのっかれます
ジャンプと障害物を~
合体!
今回の当たり判定
• 障害物はfkut_BlockModel
• プレイヤーはfkut_SphereModel
• 当たり判定には、fkut_BlockModelの変数に対し
てcheckToMovingSphere()を使う
– block.checkToMovingSphere(other, spd , back);
• otherの部分に操作しているSphereModelを、
spdに動かす予定の速度を、backには空のfk_Vectorを渡す
– if(命令 == true)でYesなら衝突している
• backの部分に渡したfk_Vectorには、spdをどれだけ
減算すれば衝突寸前まで戻せるかを表すベクトルが入る
真の衝突判定とは
• ある瞬間にぶつかってるかどうか、を
調べるだけでは「干渉判定」でしかない
• 「これくらい動く予定なんだけど、
どこかでぶつかっちゃう?」を調べる
!!!!
!
?
!
vSpdが非常に重要な変数になる
• まずは次のフレームでどれだけ動かした
いかをvSpdに蓄積し、当たり判定で修正
• 修正が済んだvSpdをモデルに
glTranslate()で適用する
• Block対Blockなら
checkToMovingBlock()で同じように
判定できる
用途に応じて使い分け
• キャラクターは球
– 見た目はゴージャスに
作った形状でもいい
– それらを覆うような球
を当たり判定用に用意
して、親子関係を結べ
ばいい
• entry()しなければ表示
されない
• マップはブロック
– 球だとつるつるすべっ
て操作性に難がある
実は当たり判定よりも難しい?
当たった場合の戻し方
戻し方の罠
• 動物体の次フレームでの位置を仮定する
• その動きを阻害する可能性のある物体全
てと衝突判定を行う
• 戻しベクトルが発生したら動物体に適用
する
• 全物体と判定を終えたら終了…
ではない
以下のようなシチュを考える
• 右図のような状況の
場合、Aに衝突して発
生した戻しベクトル
によって、Bに衝突す
る危険性がある
• A→Bの順に判定でき
ればいいが、そうな
らなかったらどうす
る?
真上から見た図
解決案
• 全部の物体と判定して、 do {
「戻しベクトルが発生
戻しベクトル初期化
しなかったら」判定終
for(障害物全部) {
了とする
当たり判定する
• 色々効率化の余地はあ
戻しベクトル加算
るだろうが、とりあえ
}
ずはこうしておこう
動物体に適用
} while(適用したベクト
ルがゼロじゃなかった
らもう1回ループ);
重力の扱い
• 基本的には常時下向
きの力を働かせる
• そうすると、同じ高
さで並べたブロック
でつっかかる
– 足下のブロックから先
に判定できればいいが、
そうもいかない
• 速度をXZ方向とY方
向に分解して2回判定
真横から見た図
A
B
物体を押せるようにした場合
• 押されて動いた物体vs全物体での判定も
必要
• 連鎖的に押せるような状況作りは困難
– 判定回数が指数関数的に増加する
• 押して動かせるのは限定的にするべき
その他もろもろ
カメラを一緒に動かす
• 自分で用意したfk_Modelの変数をカメラ
としてセットすると、物体同様に動きを
コントロールすることが可能
• キャラクターの動きと同期すれば、FPS的
な画面も作れる
– 見下ろし系のゲームの場合、Y軸方向にも同
期させると気持ち悪いので注意
Modelシリーズの回転制御命令
• 今のところ「方向」を指定するやり方し
か教えていないが、他にも色々あります
– XYZ軸それぞれについてこのくらいの角度
で!などといった姿勢の指定が可能
• glAngle()
– 現在位置からここを中心に回転しろ、なんて
命令も
• glRotateWithVec()
• リファレンスを見て実験して確かめよう
ぶつかるためじゃない当たり判定
• ゲームでは「ある地点に到達したら何か
がおきる」という処理も必要
• fkut_BlockModelを配置して、そこに接
触したらイベント発生、という使い方も
できる
– entryしなければ表示はされない
今回の課題
(ステップアップ式)
• BASIC
– ジャンプで上っていけるフィールドを作ってみよう
• ADVANCED
– ゴール地点を作り、そこに到達したらメッセージを
表示してプログラムが終了するようにしてみよう
• fl_alert(“これでメッセージが出る”);
• exit(0); // これでプログラムが終了する
• EXTREME
– 障害物が入り組んだフィールドを作った上で、
抜けのない戻し方を実装してみよう