210 likes | 347 Views
プロジェクト演習 Ⅱ インタラクティブゲーム制作. 第 8 回 はじめての 3D プログラミング 当たってる よ 編. 今日の内容. どん がら クラッシャー 当たり判定の基礎 条件分岐の嵐 配列と繰り返しもそろそろ使おうか. 今週 のプロジェクト. 授業資料ページからダウンロードします 落とした Zip ファイルを解凍して、 出てきたフォルダを好きなところに配置 今週の FKUT 更新情報 衝突判定関連の機能を追加. 今日のサンプル. 丸いのが当たります 四角いのも当たります ぶつかります. 一応プログラミング演習にあわせて自重してたんだけど.
E N D
プロジェクト演習Ⅱインタラクティブゲーム制作プロジェクト演習Ⅱインタラクティブゲーム制作 第8回 はじめての3Dプログラミング 当たってるよ編
今日の内容 • どんがらクラッシャー • 当たり判定の基礎 • 条件分岐の嵐 • 配列と繰り返しもそろそろ使おうか
今週のプロジェクト • 授業資料ページからダウンロードします • 落としたZipファイルを解凍して、出てきたフォルダを好きなところに配置 • 今週のFKUT更新情報 • 衝突判定関連の機能を追加
今日のサンプル • 丸いのが当たります • 四角いのも当たります • ぶつかります
一応プログラミング演習にあわせて自重してたんだけど一応プログラミング演習にあわせて自重してたんだけど 配列、使えてる?大丈夫?
C++での配列 • Javaより簡単に扱えます • double dDs[20]; • これだけでOK • fk_Vectorや fkut_SphereModelとかも可 • Javaよりデンジャラスです • 要素数をオーバーするとどんがらクラッシュ • クラッシュしてくれる場合はまだマシで、普通に動いてるように見えて内部では崩壊している場合も…
繰り返しと組み合わせると fkut_SphereModelmaru[20]; for(inti = 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 • ブロックや球をぐいぐい押せるようなフィールドを作ってみよう(かなり難)