プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション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 – 物体をぐいぐい押せるようなフィールドを 作ってみよう(かなり難)
© Copyright 2024 ExpyDoc