Upload
orien
View
52
Download
1
Embed Size (px)
DESCRIPTION
プロジェクト演習 Ⅱ インタラクティブゲーム制作. 第 8 回 はじめての 3D プログラミング 当たってる よ 編. 今日の内容. どん がら クラッシャー 当たり判定の基礎 条件分岐の嵐 配列と繰り返しもそろそろ使おうか. 今週 のプロジェクト. 授業資料ページからダウンロードします 落とした Zip ファイルを解凍して、 出てきたフォルダを好きなところに配置 今週の FKUT 更新情報 衝突判定関連の機能を追加. 今日のサンプル. 丸いのが当たります 四角いのも当たります ぶつかります. 一応プログラミング演習にあわせて自重してたんだけど. - PowerPoint PPT Presentation
Citation preview
プロジェクト演習Ⅱインタラクティブゲーム制作
第 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–ブロックや球をぐいぐい押せるような
フィールドを作ってみよう ( かなり難 )