スライド 1

プロジェクト演習Ⅱ
インタラクティブゲーム制作
イントロダクション2
第5回
はじめての3Dプログラミング
当ててんのよ編
今日の内容
• 配列と繰り返し
– プログラミング演習に先駆けてやっちゃう
• 当たり判定の初歩の初歩
– まずはシンプルで簡単なところから
今週のプロジェクト
• 授業資料ページからダウンロードします
– 落としたZipファイルを解凍して、
出てきたフォルダを好きなところに配置
今日のサンプル
• 丸がいっぱい出ます
• それにぶつかれます
エラー対策
• 行番号を表示する
– ツール→オプション→テキストエディタ
→C/C++→全般→行番号、にチェック
• ビルド前には必ず前に動かしていたプロ
グラムは終了しておく
• エラーメッセージはダブルクリックする
と原因行に飛ぶので、そこでタイプミス
や文法ミスを調べる
一応プログラミング演習にあわせて自重してたんだけど
配列、使っちゃいます
配列とは
• 普通の変数が一戸建
てなら、配列は集合
住宅みたいなもの
• 複数の箱が塊になっ
ていて、それぞれに
番号がついている
• “配列名[番号]”のよう
にすれば普通の変数
と同じように使える
A
C
B
D[0]
D[1]
D[2]
D[3]
D[4]
C++での配列
• Javaより簡単に扱えます
– int
– double
iDs[10];
dDs[20];
• これだけでOK
• あまり無茶な数量はやめてあげてね
– fk_Vector や fkut_(ほげほげ)Model とかも
配列として使ってOK
何故配列を使うのか?
• 繰り返しと組み合わ
せると嬉しいから!
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を座標値の計算に使うと、手間のかかる
配置が楽できたり、計算式次第では美し
い形ができたりします
– 2重、3重のループにすれば平面や立体空間に
展開する形状が作れます
配列を使う上での注意点
• 添え字が[個数-1]を超えないように!
– iDs[10]で作ったら0,1,2,…,8,9までです
– オーバーした場合、落っこちるならまだよし、
落ちずに不可思議な挙動をすることも…
• 配列の個数には変数を使えません
– 10とか20とか、数値を直接指定します
• プログラム中に直書きする値のことを「定数」と
呼びます
ガチ数学の世界へようこそ
当たり判定の基礎
衝突判定とは
•
•
•
•
CG上で物がぶつかっているか
どこでぶつかったか
いつぶつかったか
どのくらい位置を動かすと帳尻が合うか
• などなどを計算して求める、数学を
ふんだんに活用する技術分野である
衝突判定用の形状
• 見た目通りに厳密な判定をすると、大量
に物体が存在するゲーム(無双など)は
処理が重くて大変なことになる
– 力業で考えた場合、物体数*物体数の回数分
判定処理を行わなければならない
• 判定用の簡易形状を用意し、裏ではそれ
で計算するのがセオリー
判定素材としての「球」
• 中心間の距離が、お
互いの半径の合計よ
り小さかったら衝突
• 一番シンプルな判定
• 球だけで押し通すの
は厳しいが、他の判
定と併用することも
多く、活躍する
– 球の中心を「点」から
「線分」に拡張するこ
とにより「カプセル」
へと進化する
判定の原理
• 2つの球の中心点をA,Bとする
• 2点(A,B)間の距離は以下のように表せる
– C=B-A
– dist = √(C.x*C.x + C.y*C.y + C.z*C.z)
• 2点間の距離が2つの球の半径の合計以上
なら未衝突、以下なら衝突発生
とりあえず
• 細かいことはこっちでやっておきました
– sphere.checkToSphere(other_s, back);
• other_sの部分に他のSphereModelを、backには空の
fk_Vectorを渡す
– 命令の実行結果として、衝突していたらtrue(条
件式のYesに相当)、していなければfalse(Noに相
当)が返ってくる
• if(命令 == true)でYesなら衝突している
– backの部分に渡したfk_Vectorには、sphereを
どれだけglTranslate()すれば衝突寸前まで戻せ
るかを表す戻しベクトルが入る
戻し方
• 操作キャラVS障害物全部の判定が必要
• 1つずつ調べ、ぶつかっていたらめり込み
分動かして元に戻す
– 戻す方向に注意が必要
• 障害物が別々の変数だと大変、だが…
– 配列を使うことで繰り返しで片付けられる
注意点
• あまり高速に動かしていると、貫通して
しまう場合がある
– 速度が大きい場合は、少しずつ動かして判定
するのが吉
• 物体が密集していると、押し合いへし合
いしてあらぬ方向へ押し出される
– ゲームを構成する最低限の配置を工夫しよう
ブロックも判定素材として使える
• 原理は複雑ですが、
とりあえず気にせず
使ってください
• checkToSphere()と
checkToBlock()が
あるので、状況に
合わせて使い分ける
• 球側には
checkToBlock()が
無いのでブロック側
から判定する
– 戻しベクトルを反転し
て扱うので注意!
次回に向けての課題
• 今回のサンプルはジャンプ関係の処理を
一切入れていません
– どう組み合わせたらいけるだろう?
– ジャンプして乗っかるってどうすれば?
• 高速でぶつかってすり抜ける問題
– 少しずつ動かして判定する、などの手段は
考えられるけど…
今回の課題
• BASIC
– ボンバーマン的なフィールドを作ってみよう
(ブロックで仕切られたフィールド)
• ADVANCED
– 物体が自由に配置されているフィールドを
作ってみよう(坂道とかもあったりして)
– 空に上っていかないようにするにはどうすれば?
• EXTREME
– 物体をぐいぐい押せるようなフィールドを
作ってみよう(かなり難)