プロジェクト演習Ⅱ インタラクティブゲーム制作 第8回 はじめての3Dプログラミング 当たってるよ編 今日の内容 • どんがらクラッシャー – 当たり判定の基礎 – 条件分岐の嵐 – 配列と繰り返しもそろそろ使おうか 今週のプロジェクト • 授業資料ページからダウンロードします – 落としたZipファイルを解凍して、 出てきたフォルダを好きなところに配置 • 今週のFKUT更新情報 – 衝突判定関連の機能を追加 今日のサンプル • 丸いのが当たります • 四角いのも当たります • ぶつかります 一応プログラミング演習にあわせて自重してたんだけど 配列、使えてる?大丈夫? C++での配列 • Javaより簡単に扱えます – double dDs[20]; – これだけでOK – fk_Vector や fkut_SphereModel とかも可 • Javaよりデンジャラスです – 要素数をオーバーするとどんがらクラッシュ – クラッシュしてくれる場合はまだマシで、 普通に動いてるように見えて内部では 崩壊している場合も… 繰り返しと組み合わせると fkut_SphereModel maru[20]; for(int i = 0; i < 20; i++) { maru[i].glMoveTo(-100.0 + i*10.0, 0.0, 0.0); maru[i].create(4, 5.0); window.entry(&maru[i]); } • 座標値を計算して、 ずらーっと細かい物 体を 並べたりできます • 共通の設定項目をま とめて書けたりしま す どんどん使いましょう • いっぱい敵を出したり、地形用のパーツ を作るときには配列の方が便利なことが 多いです • iを座標値の計算に使うと、手間のかかる 配置が楽できたり、計算式次第では美し い形ができたりします ガチ数学の世界へようこそ 当たり判定の基礎 衝突判定とは • • • • CG上で物がぶつかっているか どこでぶつかったか いつぶつかったか どのくらい位置を動かすと帳尻が合うか • などなどを計算して求める、絶望的な までに数学スパイラルな技術分野である 衝突判定用の形状 • 見た目重視で表示している形状で厳密な 判定をすると、無双などはやってられな いことになる • 判定用の簡易形状を用意し、裏ではそれ で計算するのがセオリー 球ベース判定 • 球 – シンプルイズベスト – 球だけで押し通すのは厳しいが、他の判定と併用 することも多い – 球の中心を「点」から「線分」に拡張することに より、「カプセル」へと進化する • カプセル – 球よりボリュームの広いエリアをカバー – 球の弾丸貫通問題対策としても使用 – ボーンのように組み合わせれば人型キャラの判定 は十分作れる 球とカプセル • 中心間の距離が、お 互いの半径の合計よ り小さかったら衝突 • 球がうぞぞぞぞっと 動いた軌跡 • 組み合わせて人型に したり、弾丸貫通 問題への対処に使う 角張り系判定 • AABB – XYZ軸に平行な直方体 – 球やカプセルとの判定も可能で、その場合は裏技 を使ってOBB同様の扱いができる • OBB – 自由に回転できる直方体 – 角張り系判定の究極系とされる • 凸包 – 対球に関しては最強レベルの判定素材 – 凸包同士や、その他の判定素材との連携が困難 凸包とは • 凹んだ部位のない 立体 • n角柱、n角錐なども 凸包に含まれる • 点(球)との内外判定が べらぼうに簡単 – 衝突検出になると 難しいが。。。 とりあえず • 球と四角形で判定してみましょう • create()したもの同士はすぐ判定できます – sphere.checkToSphere(other_s, back); – block.checkToBlock(other_b, back); – block.checkToSphere(other_s, back); • if(命令 == true)でYesなら衝突しており、 backに設定したfk_Vectorの変数に 戻しベクトルが入る 注意点 • あまり高速に動かしていると、貫通して しまう場合がある – 速度が大きい場合は、少しずつ動かして判定 するのが吉 • 物体が密集していると、押し合いへし合 いしてあらぬ方向へ押し出される – ゲームを構成する最低限の配置を工夫しよう 実演します、コードの公開はあとでね その他もろもろ カメラを一緒に動かす • 自分で用意したfk_Modelの変数をカメラ としてセットすると、物体同様に動きを コントロールすることが可能 • キャラクターの動きと同期すれば、FPS的 な画面も作れる • 見下ろし系のゲームの場合、Y軸方向にも 同期させると気持ち悪いので注意 任意軸回転 • これまでは「方向」を指定するやり方し か教えていなかった • XYZ軸それぞれについてこのくらいの角度 で!などといった姿勢の指定が可能 – glAngle() • 現在位置からここを中心に回転しろ、な んて命令も – glRotateWithVec() 今日の課題 • BASIC – ボンバーマン的なフィールドを作ってみよう • ADVANCED – マリオ64的なフィールドを作ってみよう • EXTREME – ブロックや球をぐいぐい押せるような フィールドを作ってみよう(かなり難)
© Copyright 2024 ExpyDoc