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