スライド 1 - [Game Science Project Web Page]

プロジェクト演習Ⅱ
インタラクティブゲーム制作
第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
– ブロックや球をぐいぐい押せるような
フィールドを作ってみよう(かなり難)