第 3 回:はじめての3Dプログラミング・動かしちゃうぞ編

Download Report

Transcript 第 3 回:はじめての3Dプログラミング・動かしちゃうぞ編

プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2

第3回 はじめての3Dプログラミング 動かしちゃうぞ編

今日の内容

• 条件分岐がなくちゃはじまらない • あなたについていきます • 位置と姿勢の制御

今週のプロジェクト

• 授業資料ページからダウンロードします – 落としたZipファイルを解凍して、 出てきたフォルダを好きなところに配置

今日のサンプル

• 基本構造自体は先週の物と大差ありません • 一応車、のつもりです • 今日の内容に合わせて改造していきます

ゲームがゲームであるために

条件分岐で動かそう

条件分岐とは?

• • フローチャートで言うひし形のやつ 数値と変数、変数と変数の値の関係によって YesだったりNoだったりするもの • ゲームにおける条件分岐とは? – あるキーが押されているか? – 今キャラクターはどの場所にいるか? – フラグは立っているか?

キーは押されているか?

• 以下のように入力してみよう } while(window.update() == true) { // ここから入力 if(window.getSpecialKeyStatus(FK_RIGHT) == FKUT_SW_PRESS) { body.glTranslate(1.0, 0.0, 0.0); } if(window.getSpecialKeyStatus(FK_LEFT) == FKUT_SW_PRESS) { body.glTranslate(-1.0, 0.0, 0.0); } // ここまで

さっきのコードの意味

} if(→キーは押されているか?) { blockを今の位置からX方向に1.0だけ移動しろ } if(←キーは押されているか?) { blockを今の位置からX方向に-1.0だけ移動しろ

他のキーを判定したい場合

• • • • • • getSpecialKeyStatus(キーコード) – キーコードは次のスライド参照 getKeyStatus(‘調べたいキーの文字’) – シングルクォート(SHIFT+7)で半角文字を 1つだけ囲って指定する == FKUT_SW_PRESS(押されてる) FKUT_SW_DOWN(押された瞬間) FKUT_SW_UP(離された瞬間) FKUT_SW_RELEASE(離されてる)

FK_SHIFT_R, FK_SHIFT_L, FK_CTRL_R, FK_CTRL_L, FK_ALT_R, FK_ALT_L, FK_ENTER, FK_BACKSPACE, FK_DELETE, FK_CAPS_LOCK, FK_TAB, FK_PAGE_UP, FK_PAGE_DOWN, FK_HOME, FK_END, FK_INSERT, FK_LEFT, FK_RIGHT, FK_UP, FK_DOWN,

getSpecialKeyStatus()で 使えるキーコード

//!< 右シフトキー //!< 左シフトキー //!< 右コントロールキー //!< 左コントロールキー //!< 右オルトキー //!< 左オルトキー //!< エンターキー //!< バックスペースキー //!< デリート(削除)キー //!< CapsLockキー //!< タブキー //!< ページアップキー //!< ページダウンキー //!< ホームキー //!< エンドキー //!< インサートキー //!< 左矢印キー //!< 右矢印キー //!< 上矢印キー //!< 下矢印キー FK_F1, FK_F2, FK_F3, FK_F4, FK_F5, FK_F6, //!< F1 キー //!< F2 キー //!< F3 キー //!< F4 キー //!< F5 キー //!< F6 キー FK_F7, FK_F8, FK_F9, FK_F10, //!< F10キー FK_F11, //!< F11キー FK_F12 //!< F12キー //!< F7 キー //!< F8 キー //!< F9 キー

「瞬間」ってどういうこと?

ゲームプログラムは 回っている

それはすごい勢いで

• • • • •

プログラミング演習の プログラムとの違い

開始 計算はじめまーす 入力値とかとってきまーす 足したり引いたりしまーす 答え出ちゃったから出しまーす おしまーい、あはははーっ 入力 計算 出力 終了

ゲームの場合はこうだ

開始 • • • • • • • 表示するものの準備 画面の表示(描画) [条件によって] 物体を動かす [条件によって] カメラとかも動かす [条件によって] 色々動かす 画面の表示に戻る ウィンドウが閉じられたら 終了 準備 Yes ウィンドウ No 閉じてないよね? ここに膨大な量の条件分岐がはさまると思え 画面描画 終了

意識しなくてはいけないこと

• • • 繰り返しが基本構造になっている – このwhileループのことをメインループと呼ぶ 繰り返しの中に書くのは 「その一瞬で何をするのか」でしかない – その積み重ねが動きの結果となって現れる – 一瞬の長さは具体的に言うと16ms 状況に応じて「その一瞬」で何をするか 適切に分岐する必要がある

せっかくの力作がバラバラに…

アニキ!ついていきやすぜ!

移動するようにしたはいいけどさ

• • bodyだけ動かすとズレる じゃあ他のタイヤも合わせて動かすの? – それはさすがにかったるいですよね • bodyを動かしたらそれにくっついてる 物は一緒に動いてくれればいいのになぁ

それすなわち親子の契りなり

• Modelシリーズ共通命令「setParent()」 – あるモデルに対して「お前の親はコイツだ」と設定 する命令 – 子モデル.setParent(親モデル, true); – これで「親が動くと子はそれについていく」という 状態になる – 「, true」に関しては今はスルー • trueにして使った方が便利な場面が多い

モデルの親子関係

• • 実は非常に深いトピック 3DCGの根幹をなすと言ってもいい • • が、この授業の趣旨は「細かいことは (とりあえず)気にしない」なのでスルー 後でみっちりやる、かもしれない

前回姿勢で混乱した人は特に気をつけてね

位置と姿勢の制御

グローバル座標とローカル座標

• • 3次元空間はx,y,zの 座標値によって表す – グローバル座標 それぞれのモデルに とっての前後、左右、上 下方向という考え方も 存在する – ローカル座標

移動や回転の指示は グローバルもローカルも両方使う

• • いきなり面と向かって「北に5m進め」と 言われても困りますよね – 自分の向いている向き基準で指示された方が わかりやすい でも電話口やメールでいきなり「今向いて いる方向に対して真横に3m進んで」と 言われたら? – 何にぶつかるかわかったもんじゃない! – 地図を見てどの方角へ、と指示された方がいい

移動制御命令

• • glTranslate(x, y, z) – 今いる位置から グローバル座標基準 で (x, y, z)の方向へ移動する – 「東に3歩、北に1歩進め」という感じの指示 loTranslate(x, y, z) – – 今いる位置から ローカル座標基準 で (x, y, z)の方向へ移動する 「前に3歩、左に1歩進め」という感じ • glMoveTo(x, y, z) – – – グローバル座標 (x, y, z)へ直接移動する 位置を固定する以外の場面では使いづらい 「この場所へワープしろ」という指示、人間業じゃない

姿勢制御命令

• • glFocus(x, y, z) – グローバル座標 で指示した場所へ そのモデルの先頭方向を向ける – – 常にある方向を向かせたい時に便利 「あのビルの方へ向け」というような感じ loFocus(x, y, z) – ローカル座標 • で指示した場所へ 先頭方向を向ける (0,0,-1)を指定した場合は何も起きない – – モデル自体を回転させたい時に便利 「今の向きに対して右側を向け」という感じ

glVec()ってなんだったの?

• • モデルの今の位置に対して、グローバル座標 のどっち側を向いているのかを指定する、と いう命令でした – 北を向け、南南東に向け、という感じです glFocus()に置き換えることもできますが、単に 方向を指示したいだけの場合はglVec()の方 が便利です – glFocus(位置+glVec()で指定する向き)で 同じ意味になりますが、まどろっこしいです

課題

• • • BASIC: – 基本図形が、カーソルキーで前後左右に 動かせるようにする ADVANCED: – 基本図形(Coneが分かりやすい)を カーソルキーの左右で回転、 前後で前進と後退ができるようにする EXTREME: – 自分の作ったものでADVANCEDの条件を満たす – 更にカーソルキー以外の操作で、何かしらの 特殊動作を行うようにする