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