ページ 1 / 1
誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年9月26日(水) 23:10
by オルゲ
どうもDxライブラリの掲示板で質問しまくっていたオルゲです。
管理者さまより、こちらに誘導されて参りました。
3Dのフライトシミュレータ的なゲームを作っており
DxLib掲示板の方でsoft屋さんのアドバイスによりとりあえず動くようにはなりました。
現段階のゲーム画面を貼っておきます。
今回質問したい事は題名にもある通りカメラの件です。ゲーム画像だと機体の後ろにカメラがあります。DxLib基本アクションから少しお借りしてきているので、現在カメラ関数はSetCameraPositionAndTarget_UpVecYを使用しています。
私はカメラを機体のコックピットに置き、機体と一緒に回転移動をさせたいと思っています。
この場合soft屋さん曰く、「SetCameraViewMatrix()を使うといい、機体と同じマトリックスが使える」と教えてくれました。
そこで、SetCameraViewMatrix()に機体で使われているであろうMATRIXを入れてみたのですが、変な方向を向いていたり、回転と動きがおかしかったり、真っ暗になったりするのです。
もしかすると私が機体と同じマトリックスの部分を勘違いしているかもしれないので、コードを見ていただきたくここに参上しました。
コード:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ↓省略されているが、ボタンを押すとrollなどに値が入り回転
//ロール
zAxis = VGet(mat.m[2][0], mat.m[2][1], mat.m[2][2]);
Quaternion = Quaternion * CreateRotationQuaternion(roll, zAxis);
//ピッチ
xAxis = VGet(mat.m[0][0], mat.m[0][1], mat.m[0][2]);
Quaternion = Quaternion * CreateRotationQuaternion(pitch, xAxis);
//ヨー
yAxis = VGet(mat.m[1][0], mat.m[1][1], mat.m[1][2]);
Quaternion = Quaternion * CreateRotationQuaternion(yaw, yAxis);
//回転 の掛け算
matRot = QuaternionToMatrix(Quaternion);
mat = MMult( mat, matRot );
//方向ベクトル だと思っている。
mat1 = VTransform(pl.AnglePosition,matRot);
//移動 違う場所で計算されている。
matTrans = MGetTranslate( VGet(JETMOVE.x,JETMOVE.y,JETMOVE.z) );
mat = MMult( mat, matTrans );
//ワールド座標に変換
MV1SetMatrix( pl.ModelHandle, mat );
// 画面をクリア
ClearDrawScreen() ;
// プレイヤーの処理
Player_Process() ;
// カメラの処理
Camera_Process() ; //←Dxlib基本アクションのサンプルそのもの。
//SetCameraViewMatrix(mat); //←matを入れていみたが、画面真っ暗。
//SetCameraViewMatrix(MMult(matTrans,matRot)); //←ちょっと変えてみたが回転と移動がおかしい。真っ暗ではない。
// 描画処理
Render_Process() ;
~~~~~~~~~~~~~~~~~~~~~~~~~~
カメラに関わってくるであろうコードを載せてみました。うまくできてるかな。
コードの中にも書きましたが、matとMMult(matTrans,matRot)どちらも機体の動きと同じように動きません。
matに関して真っ暗と書きましたが、機体を少し回転させ動かすと一瞬白いもの(おそらく機体の一部)が画面をちらつくので完全に真っ暗というわけではないんですけどね。
どなたかSetCameraViewMatrixの使い方や,フライトゲーのカメラについてわかることあったりアドバイスくれる方お願いしますm(_ _)m。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年9月26日(水) 23:26
by 史上最悪のデスペナ
ロール、ピッチ、ヨーってなんじゃらほいってレベルの人ですが、私は似たようなことをこうしています
・まず、そもそも最初はカメラはZ軸正方向を向いている(未設定時)
・なので、最初にカメラの向きのベクトルをVGet(0.0f,0.0f,1.0f)とする
・カメラの上方向は最初はY軸正方向なのでVGet(0.0f,1.0f,0.0f)とする
・機体のX,Y,Zの回転量を持っておく(それぞれx_r,y_r,z_rとする)
・Vec = VTransform( VGet(0.0f,0.0f,1.0f), MGetRotY(y_r) );//(Y軸に対して回転)
・これをZ軸に対して回転
Vec = VTransform( Vec, MGetRotZ(z_r) );
・これをX軸に対して回転
Vec = VTransform( Vec, MGetRotZ(x_r) );
・カメラの上方向をX軸に対して回転
Up = VTransform( VGet(0.0f,1.0f,0.0f), MGetRotY(x_r) );
・これをZ軸に対して回転
Up = VTransform( VGet(0.0f,1.0f,0.0f), MGetRotY(z_r) );
機体の中心がワールド座標での座標だとすると(Posとする)
コクピットの位置に合わせてカメラ座標を
Cam_Pos = VAdd( Pos, VScale(Vec,サイズは適当に) );
とすればどうでしょう?
私はY軸回転しか行ってないのでそのあとは予想なのですが・・・・
追記
これをX軸に対して回転
Vec = VTransform( Vec, MGetRotZ(x_r) );
これをZ軸に対して回転
Up = VTransform( VGet(0.0f,1.0f,0.0f), MGetRotY(z_r) );
を追加しました
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年9月27日(木) 12:34
by softya(ソフト屋)
フォーラムルールにあります通り情報の連続性を持たせるため相互リンクをお願いしますね。向こうに書いた情報が他の人にはわかりませんので。
私の提案が一切採用されていないようですが?
1.絶対基準となるXYZ軸をDrawCone3Dなどで表示する。
これに対する動きを見ることでカメラが動いているのか物体が動いているのか確認できます。
2.カメラを固定するモードをつける。カメラを固定することで全体の動きを把握できます。
キーで動くとなお良いです。
3.カメラの予定位置に別の物体を代理表示させる。2.と絡みますがカメラが機体位置で動いているか確認できます。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年9月27日(木) 22:07
by オルゲ
こんばんは。
お忙しい中毎度ありがとうございます。
以前質問させて頂いていた場所のURLです。見返すとなかなか酷い内容ですが一応。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2745
本題です。
soft屋さんの提案、カメラのことでなく機体とマップが勝手に動くという問題の対処法だと思っていました。すみません。
それを試してみます。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年9月27日(木) 22:51
by softya(ソフト屋)
1.はカメラ行方不明とマップが勝手に動くのどちらでも有効です。
2.3.に関してはカメラ行方不明事件用の提案です。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月06日(土) 00:07
by オルゲ
こんばんわ。マップ作りをひたすらやってプログラムの方が更新していなかったオルゲです。
SetCameraViewMatrix()にmatを放り込んで真っ暗になる理由が判明しました。
少し上でコードを載せていますが、実はそのコードのすぐ上で
mat = MGetScale(VGet(2000.0,2000.0,2000.0); とジェット機を大きくしていたんです。そこのVGetの中身をすべて1.0にしたら見事前方を映しだしていました。
よくよく考えればSetCameraVierMatrix(MMult(matTrans,matRot);と同じになっただけですが。
前方を映しだしただけでヤッター、となりましたが次なる問題が発生します。(もはや決定事項)
カメラの回転と移動がジェット機と違うのです。さらに絶対軸(ワールド座標の原点)で回転しているようで、すこし移動して回転すると原点を軸としているので円を描くように回転していますこの野郎。カメラが自転していないとも言いますか。
matTransには方向ベクトルから算出されたヴェクトルJETMOVEが入っているので、カメラも同じように動くと思ったのですけどねぇ。何がいけないんでしょう。
何度もすみません。自分でもこれから色々試してみますが、よろしければお助けください。
余談
ひたすらマップを作っていたのですが、容量が大きくなりすぎると上手く読み込まないのかテクスチャが崩れていたりマップそのものを表示しなかったりMV1LoadModelにも色々制約があるんですねええええ
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月06日(土) 00:51
by softya(ソフト屋)
カメラのマトリクスは自機のマトリクスと同じ求め方をする必要がありますよ。
と言うより、自機のマトリクスをそのままカメラでSetCameraViewMatrixして使ったんですよね?
※ この時は下記のカメラ関数は使ってはいけません。
SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle
それとテクスチャは2の乗数のサイズ(32,64,256,512・・・)にするのが一番安全です。
あまり大きすぎると問題もありますので分割してください。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月06日(土) 02:21
by オルゲ
夜遅くにこんばんわ。毎度ありがとうございます。
そうです。そのまま放り込みました。求め方は同じだけど、ちゃんとカメラ用に用意してあげなきゃいけなかったってことですか。
SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle
彼らは使っていません。アクションゲームとかなら、彼らを使ってすぐにTPSっぽくできるんでしょうねえええ。
余談2
ちなみにBlenderというソフトでobjファイルを吐き出して、メタセコイアでmqoファイルに変換して使っています。
確かBlenderの方で1024だった気がしますが、おそらく大きすぎたのかもしれません。今度画像でも貼ってみたいと思います。余談ですのでただ見て欲しいというだけです。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月06日(土) 11:26
by softya(ソフト屋)
オルゲ さんが書きました:夜遅くにこんばんわ。毎度ありがとうございます。
そうです。そのまま放り込みました。求め方は同じだけど、ちゃんとカメラ用に用意してあげなきゃいけなかったってことですか。
SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle
彼らは使っていません。アクションゲームとかなら、彼らを使ってすぐにTPSっぽくできるんでしょうねえええ。
余談2
ちなみにBlenderというソフトでobjファイルを吐き出して、メタセコイアでmqoファイルに変換して使っています。
確かBlenderの方で1024だった気がしますが、おそらく大きすぎたのかもしれません。今度画像でも貼ってみたいと思います。余談ですのでただ見て欲しいというだけです。
動くソースコードを見ないとなんとも言えないですね。
出来れば見せて頂きたいです。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 13:59
by オルゲ
こんにちは。
色々試してみましたが、ごちゃごちゃして自分でしかわからないのでカッットしてソースコードをzipで貼りたいと思います。
中には実行に必要なファイル(コードとmqo)が入っているハズです。
私の場合Cにlibというフォルダを作って、そこにDxライブラリを突っ込んでいます。実行する際に面倒ですが自分が入れている場所を指定してあげないとイケないかもです。
ttp://wwws.nagano.ac.jp/j11072ry/Cord.zip
pass 86598
コードはDxLib基本アクションとクォータニオンの使い方を解説されていたサイトからほぼコピーで必要なところだけ手が加えられている感じになっています。
カメラの件はmainの下の方に、いくつかあります。
SetCameraViewMatrix()を使う時は、
//mat = MGetScale(VGet(1.0,1.0,1.0));
mat = MGetScale(VGet(2000.0,2000.0,2000.0));
ここで、2000の方をコメントアウトして上の1.0を使えばよろしいかと思います。
コード拝見オネシャス!
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 15:05
by softya(ソフト屋)
passでは解凍できないようです。確認をお願いします。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 15:13
by オルゲ
あ、早速みてくれてありがとうございます。
あれぇ自分のだと出来るのですが。パスなしでうpします。
ttp://wwws.nagano.ac.jp/j11072ry/Cord2.zip
どうでしょうか
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 15:18
by softya(ソフト屋)
オルゲ さんが書きました:あ、早速みてくれてありがとうございます。
あれぇ自分のだと出来るのですが。パスなしでうpします。
ttp://wwws.nagano.ac.jp/j11072ry/Cord2.zip
どうでしょうか
Cord2.zipもパスワードを要求されます。
更にpassではダメでした。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 16:22
by オルゲ
ぬあああんと、またダメでしたか。
おそらくこれでイケルと思います。何度もすみません。zipうpするくらいで
ttp://wwws.nagano.ac.jp/j11072ry/Cord3.zip
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 16:50
by softya(ソフト屋)
解凍して実行できました。
返答については時間が取れた時にしますのでお待ちください。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月07日(日) 17:01
by オルゲ
なんだか面倒を見てもらっていうか、本当に色々とありがとうございます。
動作部以外に必要な音楽だったりメニュー画面だったり他にやることは沢山あるので、並行しながらやっっていきたいと思います。
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月08日(月) 15:11
by softya(ソフト屋)
問題点だけ修正しました。
直した点はカメラと機体は別々にマトリクス計算(スケールやら色々問題があったので)。
カメラは仮にですが機体後方に位置させました。それと私しからの抜けとしてカメラは機体と逆行列になります。
全体的に行列演算の理解が不十分な点が見受けられますので色々試して体で覚えてください。
なお、フライト系のカメラは背景に刺さる場合は背景を避けないで背景を透明にすべきだと思います。
コード:
mat = MGetScale(VGet(2000.0,2000.0,2000.0));
//ロール
zAxis = VGet(mat.m[2][0], mat.m[2][1], mat.m[2][2]);
Quaternion = Quaternion * CreateRotationQuaternion(roll, zAxis);
//ピッチ
xAxis = VGet(mat.m[0][0], mat.m[0][1], mat.m[0][2]);
Quaternion = Quaternion * CreateRotationQuaternion(pitch, xAxis);
//ヨー
yAxis = VGet(mat.m[1][0], mat.m[1][1], mat.m[1][2]);
Quaternion = Quaternion * CreateRotationQuaternion(yaw, yAxis);
// 機体の回転
matRot = QuaternionToMatrix(Quaternion);
mat = MMult( mat, matRot );
// 機体の平行移動
matTrans = MGetTranslate( VGet(pl.Position.x,pl.Position.y,pl.Position.z) );
mat = MMult( mat, matTrans );
// 移動ベクトル
mat1 = VTransform(pl.AnglePosition,matRot);
// 機体のマトリックス設定
MV1SetMatrix( pl.ModelHandle, mat );
// 画面をクリア
ClearDrawScreen() ;
// 入力処理
Input_Process() ;
// プレイヤーの処理
Player_Process() ;
// カメラを機体後方に移動
MATRIX matCam = MGetIdent();//単位行列
matCam = MMult(matCam,MGetTranslate(VGet(0.0f,0.0f,-1000.0f))); //機体のZ後方に。
matCam = MMult(matCam,MGetRotY(- PHI_F/2.0f));//90度回転 機体が90度横を向いているので
// カメラの回転
matCam = MMult( matCam, matRot );
// カメラの平行移動
matTrans = MGetTranslate( VGet(pl.Position.x,pl.Position.y,pl.Position.z) );
matCam = MMult( matCam, matTrans );
// カメラの処理
// Camera_Process() ;
//SetCameraViewMatrix(MMult(matRot,matTrans));
MATRIX imatCam = MInverse(matCam); //逆行列。
SetCameraViewMatrix(imatCam);
// 描画処理
Render_Process() ;
Re: 誘導されて フライトシミュのカメラについて DxLib使用
Posted: 2012年10月08日(月) 21:40
by オルゲ
こんばんわオルゲです。
・・・・・!早速プログラムにぶちこんで見ました。
完璧じゃないですかああああああああああああああああ
うわああああ
まだまだ理解不十分なところが多々多々あり勉強不足で質問ばかりで申し訳なく感じております。
カメラがついてくるようになりやっとフライトシミュ的な事に挑戦するところまで来たという感じがしております。本当に感謝です。
取り敢えず背景を避ける設定はなくしました。
カメラの件ということで、このスレはもう解決になるのでしょうか。なかなか名残惜しいです。
最後に現段階のマップ的なスクショを貼りたいと思います。
しかし見ていただくとわかるように、テクスチャがところどころ欠如しているんですよね。比較としてブレンダーの画面も貼っておきます。
それでも本当にカメラの件が解決したことでかなり前進できました。これからも完成目指してどんどん進んでいきたいと思います。今までありがとうございました!

