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

Download Report

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

プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション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 – 障害物が入り組んだフィールドを作った上で、 抜けのない戻し方を実装してみよう