誘導されて フライトシミュのカメラについて DxLib使用

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オルゲ

誘導されて フライトシミュのカメラについて DxLib使用

#1

投稿記事 by オルゲ » 7年前

どうも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。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#2

投稿記事 by 史上最悪のデスペナ » 7年前

ロール、ピッチ、ヨーってなんじゃらほいってレベルの人ですが、私は似たようなことをこうしています

・まず、そもそも最初はカメラは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) );
を追加しました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#3

投稿記事 by softya(ソフト屋) » 7年前

フォーラムルールにあります通り情報の連続性を持たせるため相互リンクをお願いしますね。向こうに書いた情報が他の人にはわかりませんので。

私の提案が一切採用されていないようですが?
1.絶対基準となるXYZ軸をDrawCone3Dなどで表示する。
これに対する動きを見ることでカメラが動いているのか物体が動いているのか確認できます。

2.カメラを固定するモードをつける。カメラを固定することで全体の動きを把握できます。
キーで動くとなお良いです。

3.カメラの予定位置に別の物体を代理表示させる。2.と絡みますがカメラが機体位置で動いているか確認できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#4

投稿記事 by オルゲ » 7年前

こんばんは。
お忙しい中毎度ありがとうございます。
以前質問させて頂いていた場所のURLです。見返すとなかなか酷い内容ですが一応。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2745

本題です。
soft屋さんの提案、カメラのことでなく機体とマップが勝手に動くという問題の対処法だと思っていました。すみません。
それを試してみます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#5

投稿記事 by softya(ソフト屋) » 7年前

オルゲ さんが書きました:こんばんは。
お忙しい中毎度ありがとうございます。
以前質問させて頂いていた場所のURLです。見返すとなかなか酷い内容ですが一応。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2745

本題です。
soft屋さんの提案、カメラのことでなく機体とマップが勝手に動くという問題の対処法だと思っていました。すみません。
それを試してみます。
1.はカメラ行方不明とマップが勝手に動くのどちらでも有効です。
2.3.に関してはカメラ行方不明事件用の提案です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#6

投稿記事 by オルゲ » 7年前

こんばんわ。マップ作りをひたすらやってプログラムの方が更新していなかったオルゲです。

 SetCameraViewMatrix()にmatを放り込んで真っ暗になる理由が判明しました。
少し上でコードを載せていますが、実はそのコードのすぐ上で
mat = MGetScale(VGet(2000.0,2000.0,2000.0); とジェット機を大きくしていたんです。そこのVGetの中身をすべて1.0にしたら見事前方を映しだしていました。

よくよく考えればSetCameraVierMatrix(MMult(matTrans,matRot);と同じになっただけですが。

 前方を映しだしただけでヤッター、となりましたが次なる問題が発生します。(もはや決定事項)
カメラの回転と移動がジェット機と違うのです。さらに絶対軸(ワールド座標の原点)で回転しているようで、すこし移動して回転すると原点を軸としているので円を描くように回転していますこの野郎。カメラが自転していないとも言いますか。
 matTransには方向ベクトルから算出されたヴェクトルJETMOVEが入っているので、カメラも同じように動くと思ったのですけどねぇ。何がいけないんでしょう。
 何度もすみません。自分でもこれから色々試してみますが、よろしければお助けください。

余談
 ひたすらマップを作っていたのですが、容量が大きくなりすぎると上手く読み込まないのかテクスチャが崩れていたりマップそのものを表示しなかったりMV1LoadModelにも色々制約があるんですねええええ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#7

投稿記事 by softya(ソフト屋) » 7年前

カメラのマトリクスは自機のマトリクスと同じ求め方をする必要がありますよ。
と言うより、自機のマトリクスをそのままカメラでSetCameraViewMatrixして使ったんですよね?
※ この時は下記のカメラ関数は使ってはいけません。
 
SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle

それとテクスチャは2の乗数のサイズ(32,64,256,512・・・)にするのが一番安全です。
あまり大きすぎると問題もありますので分割してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#8

投稿記事 by オルゲ » 7年前

夜遅くにこんばんわ。毎度ありがとうございます。

そうです。そのまま放り込みました。求め方は同じだけど、ちゃんとカメラ用に用意してあげなきゃいけなかったってことですか。

SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle
彼らは使っていません。アクションゲームとかなら、彼らを使ってすぐにTPSっぽくできるんでしょうねえええ。

余談2
 ちなみにBlenderというソフトでobjファイルを吐き出して、メタセコイアでmqoファイルに変換して使っています。
確かBlenderの方で1024だった気がしますが、おそらく大きすぎたのかもしれません。今度画像でも貼ってみたいと思います。余談ですのでただ見て欲しいというだけです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#9

投稿記事 by softya(ソフト屋) » 7年前

オルゲ さんが書きました:夜遅くにこんばんわ。毎度ありがとうございます。

そうです。そのまま放り込みました。求め方は同じだけど、ちゃんとカメラ用に用意してあげなきゃいけなかったってことですか。

SetCameraPositionAndTarget_UpVecY
SetCameraPositionAndTargetAndUpVec
SetCameraPositionAndAngle
彼らは使っていません。アクションゲームとかなら、彼らを使ってすぐにTPSっぽくできるんでしょうねえええ。

余談2
 ちなみにBlenderというソフトでobjファイルを吐き出して、メタセコイアでmqoファイルに変換して使っています。
確かBlenderの方で1024だった気がしますが、おそらく大きすぎたのかもしれません。今度画像でも貼ってみたいと思います。余談ですのでただ見て欲しいというだけです。
動くソースコードを見ないとなんとも言えないですね。
出来れば見せて頂きたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#10

投稿記事 by オルゲ » 7年前

こんにちは。
 色々試してみましたが、ごちゃごちゃして自分でしかわからないのでカッットしてソースコードを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を使えばよろしいかと思います。

 コード拝見オネシャス!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#11

投稿記事 by softya(ソフト屋) » 7年前

passでは解凍できないようです。確認をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#12

投稿記事 by オルゲ » 7年前

あ、早速みてくれてありがとうございます。
あれぇ自分のだと出来るのですが。パスなしでうpします。

ttp://wwws.nagano.ac.jp/j11072ry/Cord2.zip
どうでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#13

投稿記事 by softya(ソフト屋) » 7年前

オルゲ さんが書きました:あ、早速みてくれてありがとうございます。
あれぇ自分のだと出来るのですが。パスなしでうpします。

ttp://wwws.nagano.ac.jp/j11072ry/Cord2.zip
どうでしょうか
Cord2.zipもパスワードを要求されます。
更にpassではダメでした。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#14

投稿記事 by オルゲ » 7年前

ぬあああんと、またダメでしたか。
おそらくこれでイケルと思います。何度もすみません。zipうpするくらいで
ttp://wwws.nagano.ac.jp/j11072ry/Cord3.zip

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#15

投稿記事 by softya(ソフト屋) » 7年前

解凍して実行できました。
返答については時間が取れた時にしますのでお待ちください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#16

投稿記事 by オルゲ » 7年前

なんだか面倒を見てもらっていうか、本当に色々とありがとうございます。
動作部以外に必要な音楽だったりメニュー画面だったり他にやることは沢山あるので、並行しながらやっっていきたいと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#17

投稿記事 by softya(ソフト屋) » 7年前

問題点だけ修正しました。
直した点はカメラと機体は別々にマトリクス計算(スケールやら色々問題があったので)。
カメラは仮にですが機体後方に位置させました。それと私しからの抜けとしてカメラは機体と逆行列になります。

全体的に行列演算の理解が不十分な点が見受けられますので色々試して体で覚えてください。
なお、フライト系のカメラは背景に刺さる場合は背景を避けないで背景を透明にすべきだと思います。

コード:

		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() ;
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オルゲ

Re: 誘導されて フライトシミュのカメラについて DxLib使用

#18

投稿記事 by オルゲ » 7年前

こんばんわオルゲです。

 ・・・・・!早速プログラムにぶちこんで見ました。
完璧じゃないですかああああああああああああああああ
うわああああ
 
 まだまだ理解不十分なところが多々多々あり勉強不足で質問ばかりで申し訳なく感じております。
カメラがついてくるようになりやっとフライトシミュ的な事に挑戦するところまで来たという感じがしております。本当に感謝です。

取り敢えず背景を避ける設定はなくしました。

 カメラの件ということで、このスレはもう解決になるのでしょうか。なかなか名残惜しいです。


最後に現段階のマップ的なスクショを貼りたいと思います。
 しかし見ていただくとわかるように、テクスチャがところどころ欠如しているんですよね。比較としてブレンダーの画面も貼っておきます。
それでも本当にカメラの件が解決したことでかなり前進できました。これからも完成目指してどんどん進んでいきたいと思います。今までありがとうございました!
画像画像

閉鎖

“C言語何でも質問掲示板” へ戻る