メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.659) DX29 カメラの上下運動  2006/05/08


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。