第 7 回:はじめての3Dプログラミング・跳んでぶつかり乗っかって編

Download Report

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段ジャンプできるようにしてみよう