|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第659回 DX29 カメラの上下運動 発行 2006年5月8日(月曜日) 発行数 約2500 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは、あゆしゃです。 GWはいかがだったでしょうか。 私は、久しぶりにGIBSをちょこちょこといじっていました。 掲示板らしきものをPerlでそれらしく作り、 データ形式の定数をそれらしくまとめ、 メニューの形式をキチンと計画して、従来のものを新企画に したがって作り直し、 資料を見ているうちに、ギレンがやりたくなり、息抜きに 連邦をちまちまと初めて・・・丸2日! イカンイカンと思い、気を取り直し、息抜きに クリアしたディスガイア2のデータをロード。 転生とレベルアップに励むこと・・・丸2日! イカンイカンと思い、気を取り直し、息抜きに クリアしたFF12のデータをロード。 レベル50前後のパーティーで灯台のドラゴンやギルガメッシュ に戦いを挑み、あの手この手を使って倒しましたが、倒すまでに 2時間ずつもかかっており、 ギルガメッシュのテーマはいいなぁと思いつつ、 モブ退治に励むこと・・・丸2日! イカンイカンと思い、気を取り直し、息抜きに ツタヤでDVDを8枚ほど借りてきて、 ★2枚見れないうちにGW終了 という感じの、地味な時間をすごしていました。 2枚どうしよう。。(ちなみにファーストルパン3世10話分) {magclick} /*========================================================*/ 今回のお題 << DX29 カメラの上下運動 >> /*========================================================*/ 現在、カメラは平行移動と平行回転が行えますが、 これでは、坂道や山の上のほうの確認ができません。 現在のカメラの演算は、このようになっています。 // ======================================== // カメラ回転 void DX_Rotate( float radi ) { ViewRot += radi; D3DXMATRIX m; D3DXMatrixRotationZ( &m, ViewRot ); D3DXVECTOR3 sa( 0, 1, 0 ); D3DXVec3TransformCoord( &ViewTo, &sa, &m ); ViewTo += ViewFrom; } Z軸、つまりコマを真上から見た状態でコマを回すような感じで 回転演算を行っています。 ベクトルの向きは左右0、上下は下。つまり真南を向いている 方向となってます。(駄目じゃん、北にするべきだよ) 回転角ViewRotが0なら南を向くというわけです。 上下に回転させておきたいのであれば、Z軸で回転するより先に X軸で回転しておきます。 そうすることで、カメラが上下に動くようになります。 X軸の回転は、D3DXMatrixRotationXを同じように使えば いいはずです。 まずX軸で回転しておき、次にZ軸で回転します。 そうすることで、思い通りの方向にカメラが向くように なります。 回転の順番を間違えると、変な方向を向きますので注意です。 /*========================================================*/ ViewRot += radi; D3DXMATRIX m; D3DXVECTOR3 sa( 0, 1, 0 ); D3DXMatrixRotationX( &m, ViewPop ); ←追加 D3DXVec3TransformCoord( &sa, &sa, &m ); ←追加 D3DXMatrixRotationZ( &m, ViewRot ); D3DXVec3TransformCoord( &ViewDir, &sa, &m ); ViewTo = ViewDir + ViewFrom; 関数の中を、このようにしてみました。 X軸の演算が2行だけ追加されています。 上下の角度は、ViewPopという変数で持つようにしました。 D3DXMatrixRotationX( &m, ViewPop ); D3DXVec3TransformCoord( &sa, &sa, &m ); まずX軸で回転演算をつくり、実際にベクトルを回転して いったんsaに保存します。 D3DXMatrixRotationZ( &m, ViewRot ); D3DXVec3TransformCoord( &ViewDir, &sa, &m ); 次にZ軸で回転演算を作り、さっきのベクトルを再び回転して ViewDirに保存します。 今後、ViewToを求めるときは必ず、ViewDir+ViewFromという 式を使うようにします。 これで、上下に回転できるようになります。 /*========================================================*/ 今回修正分のソース(SDGWETキー処理も追加されてます) http://ayusya.hp.infoseek.co.jp/Source/DX9Sample_060508.cpp http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060508.png いままでは上下角が0度固定であったために、山の上のほうは 見えませんでしたが、 今回追加した回転処理で、見えない風景が見えるようになり ました。 新鮮な気分です。 気になっていたぎざぎざは、ポリゴンの境界だと思っていたの ですが、その割には小さすぎます。 ひょっとしてZバッファの1マス分の大きさでしょうか? なんだか説得力がありそうなので、そういうことにしておき ましょうか? {magclick} /*========================================================*/ さいごに /*========================================================*/ 3Dのプロに言わせると、Z軸とX軸を同時に演算できそうだと いわれそうですが、(たいてい掛け算で合成している) 分けて考えたほうが分かりやすいです、私が。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は5月15日(月曜日)に、第660回をお送りします。 お題は「DX30 第3階層」 建造物の詳細描画は、上手くいかないようです。 先に第3階層を作りましょう。 5月以降、少し忙しくなる理由で、週に1度とします。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 さぁ新学期(ちがう) なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー★検索するならこちらが便利★ http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★タイトル探しはこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |