カメラの行列指定(C++/Dxlib)

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

カメラの行列指定(C++/Dxlib)

#1

投稿記事 by Record » 12年前

3Dゲームを作ろうと、カメラを指定してみたのですが、シンプルなコードなのに思った通りに動きません。
カメラをX:0,Y:0,Z:-50の位置に持って行き、(角度はデフォルト)それをそのままカメラ行列としました。
その後、DXライブラリの標準関数でX:0,Y:0,Z:50の位置に大きさ50の真っ白い球体を配置しました。
期待値は画面の中央に白い球が表示されることなのですが、うまく動きません。

コード自体に問題がなければ他の原因を探したいのですが、確認という形になってしまいますが、
下記のコードは期待値どおりになる処理なのか教えていただきたいです。

コード:

MATRIX matrix = MGetIdent();
matrix = MMult(matrix, MGetTranslate(VGet(0,0,-50)));
SetCameraViewMatrix((matrix));
DrawSphere3D(VGet(0,0,50),50,1000,GetColor(255,255,255),GetColor(255,255,255),1);
また、最終的には行列を利用して球体を軸にカメラを回転させたいです。
①カメラを後ろに動かす
②カメラを球体の向きと合わせる(回転させる)
③カメラを球体の座標に移動させる

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

Re: カメラの行列指定(C++/Dxlib)

#2

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

SetCameraPositionAndTarget_UpVecYで同じX:0,Y:0,Z:-50にカメラを置いて、taregtを0,0,0にしてみると分かると思いますが、この状態でGetCameraViewMatrix()で得られる行列と
matrix = MMult(matrix, MGetTranslate(VGet(0,0,-50)));
が違っていませんか? 違っていたら間違いがあると言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: カメラの行列指定(C++/Dxlib)

#3

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

先ほど書いたのは、自分が正しいことをしているか確認するための方法です。
プログラミングでは他の手段で自分が正しいことしているか確認できる手段があるなら積極的に使うことで無駄な試行錯誤を減らして効率よく目標に向かうことが出来ます。
それと元のコードですが4方位に違う色で球体を表示する事で、どう間違っているか視覚的に確認することも出来ます。
まず4方向に球体を表示してみて、間違いは何処にあったか考えてみましょう。
結果が、どうなったか教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Record

Re: カメラの行列指定(C++/Dxlib)

#4

投稿記事 by Record » 12年前

コード:

	MATRIX matrix = MGetIdent();
	matrix = MMult(matrix, MGetTranslate(VGet(0,0,-50)));
			
//	SetCameraViewMatrix(matrix);

	SetCameraPositionAndTarget_UpVecY(VGet(0,0,-50),VGet(0,0,0));
	MATRIX _matrix = GetCameraViewMatrix();

	DrawSphere3D(VGet(0,0,50),10,1000,GetColor(255,255,255),GetColor(255,255,255),1);
	DrawSphere3D(VGet(0,0,-50),10,1000,GetColor(255,255,0),GetColor(255,255,255),1);
	DrawSphere3D(VGet(50,0,0),10,1000,GetColor(255,0,255),GetColor(255,255,255),1);
	DrawSphere3D(VGet(-50,0,0),10,1000,GetColor(0,255,255),GetColor(255,255,255),1);
画像
以上のようにしてみましたが、円盤?のような実行結果になりました。色は正面を向いている事を表す、白です。

変数の中身はこんなでした
画像
SetCameraPositionAndTarget_UpVecYで指定したほうは、なぜか50という値の符号が反転しています
この座標では、(0,0,50)の座標に存在する球体の中心にカメラがあることになります。
しかし、実際に描画されているのは(形が変とはいえ)SetCameraPositionAndTarget_UpVecYのほうです。

そこで、

コード:

	MATRIX matrix = MGetIdent();
	matrix = MMult(matrix, MGetTranslate(VGet(0,0,50)));
			
	SetCameraViewMatrix(matrix);

	DrawSphere3D(VGet(0,0,50),10,1000,GetColor(255,255,255),GetColor(255,255,255),1);
	DrawSphere3D(VGet(0,0,-50),10,1000,GetColor(255,255,0),GetColor(255,255,255),1);
	DrawSphere3D(VGet(50,0,0),10,1000,GetColor(255,0,255),GetColor(255,255,255),1);
	DrawSphere3D(VGet(-50,0,0),10,1000,GetColor(0,255,255),GetColor(255,255,255),1);
とした所同じ結果が得られました。
カメラの座標系と、描画されるオブジェクトの座標系は反転しているのでしょうか?

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

Re: カメラの行列指定(C++/Dxlib)

#5

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

> カメラの座標系と、描画されるオブジェクトの座標系は反転しているのでしょうか?

良いポイントに気づかれました。
普通のモデルは、行列でワールド座標系のなかを移動しますが、カメラは逆でカメラを固定してワールド座標側を回すのです。
と言うことで逆がキーワードに成りますが、カメラを動かしたい行列の逆行列をカメラビュー行列に設定すると移動・回転でお望みの結果が得られると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Record

Re: カメラの行列指定(C++/Dxlib)

#6

投稿記事 by Record » 12年前

なるほど、カメラというのは名前だけで実態はワールド行列ということでしたか。
円盤になっているのは仕様なのかよくわかりませんが、ありがとうございました!

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

Re: カメラの行列指定(C++/Dxlib)

#7

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

円盤になっているのは、射影変換の方の問題では無いでしょうか?
初期化されていない場合にどうなっているか不明です。
勘で書いてますので、間違っているかも知れない事をお断りしておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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