カメラの向きを指定した方向へ向かせたい

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

カメラの向きを指定した方向へ向かせたい

#1

投稿記事 by 珈琲 » 13年前

行列によって回転している立方体にカメラを向けさせたいのですが、DXライブラリのリファレンスとにらめっこしてもなかなかうまくいきません。
どうしたらいいでしょうか?

コード:

	float i=0;
             float t=0;

	while(loop()==0){

            //回転しながらx方向へ移動
            t+=1;
		i+=3.1415921684/180;
		MV1SetMatrix(block_object_handle,MMult(MGetRotY(i),MGetTranslate(VGet(t,0,0))));
            //描画
		MV1DrawModel(block_object_handle);

            //ココ

		SetCameraViewMatrix();
	}
ココと書いてあるらへんにカメラをblock_object_handle向ける処理をかくのだと思うのですが、
カメラの現在の座標やらなんやらの行列が取得できる関数がないのでできません。

そこでちょっと考えたのですが、もしかしてカメラの座標や、block_objectなんかも自分で座標変数を持っていて、計算があるときだけ行列に変換するのでしょうか?
ただ、その場合DXライブラリ内部とライブラリを使うプログラム側で2重に座標を持つことになりますし、
描画だけでなく移動や回転にも行列を使うので、計算後に行列→座標変数に変換が必要になって現実的じゃない気がします

もしよろしかったら座標・角度・倍率の運用方法を教えて下さい

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

Re: カメラの向きを指定した方向へ向かせたい

#2

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

インデントは綺麗にしたほうが良いですよ。
見やすくなりますので、回答がつきやすくなります。

質問の件ですが、注視点の座標が分かっているのならSetCameraPositionAndTarget_UpVecY()で注視できます。
「DXライブラリ置き場 3D関係関数リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R12N2

>そこでちょっと考えたのですが、もしかしてカメラの座標や、block_objectなんかも自分で座標変数を持っていて、計算があるときだけ行列に変換するのでしょうか?
>ただ、その場合DXライブラリ内部とライブラリを使うプログラム側で2重に座標を持つことになりますし、
>描画だけでなく移動や回転にも行列を使うので、計算後に行列→座標変数に変換が必要になって現実的じゃない気がします

MV1SetMatrix()しているならMV1GetMatrix()可能です。
原点座標にMV1GetMatrix()で得たマトリクスを適用すると注視点の座標を求めることもできます。
管理しやすい方で構わないと思います。

>もしよろしかったら座標・角度・倍率の運用方法を教えて下さい

これの質問の詳細がわからないので何の座標・角度・倍率の話か説明してもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: カメラの向きを指定した方向へ向かせたい

#3

投稿記事 by h2so5 » 13年前

本題とは関係ないですが円周率が間違っています。実際は小数点以下7桁からは6535...と続きます。
DXライブラリのヘッダにPHIというマクロが定義されていたはずなのでそちらを使ったほうがよいと思います。

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#4

投稿記事 by 珈琲 » 13年前

回答ありがとうございます

>インデントは綺麗にしたほうが良いですよ。
失礼しました。ココのテキストボックス内だとインデントがずれるのでスペースで調節してたんですが、裏目に出たようで・・

>質問の件ですが、注視点の座標が分かっているのならSetCameraPositionAndTarget_UpVecY()で注視できます。
行列で指定したいのですが、DXライブラリの作者は「行列の場合は自分で計算しろ」という意図なのでしょうか?
できたらSetCameraViewMatrix()を使って行列で管理したいです。

>これの質問の詳細がわからないので何の座標・角度・倍率の話か説明してもらえますか?
えーと、モデル全般というか、共通した一般的なデータの持ち方というのはないのでしょうか?

今までだったら

コード:

class base{
 int handle;
 int x;
 int y;
 int z;
 int angle;
};
と座標を持ってたのが

コード:

class base{
 int handle;
 MATRIX matrix;
};
となるのか

コード:

class base{
 int handle;
};
そもそもモデルハンドル自体にMATRIXの情報が内包しているのでクラスに記述する必要がないとか・・・
DXライブラリは行列から各種データを取り出す関数が豊富?なのでこっちのほうがいい・・?

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#5

投稿記事 by 珈琲 » 13年前

h2so5 さんが書きました:本題とは関係ないですが円周率が間違っています。実際は小数点以下7桁からは6535...と続きます。
DXライブラリのヘッダにPHIというマクロが定義されていたはずなのでそちらを使ったほうがよいと思います。
あ、すいません
曖昧でした。
PHIですね

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

Re: カメラの向きを指定した方向へ向かせたい

#6

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

珈琲 さんが書きました:回答ありがとうございます

>インデントは綺麗にしたほうが良いですよ。
失礼しました。ココのテキストボックス内だとインデントがずれるのでスペースで調節してたんですが、裏目に出たようで・・

>質問の件ですが、注視点の座標が分かっているのならSetCameraPositionAndTarget_UpVecY()で注視できます。
行列で指定したいのですが、DXライブラリの作者は「行列の場合は自分で計算しろ」という意図なのでしょうか?
できたらSetCameraViewMatrix()を使って行列で管理したいです。
出来ないわけじゃないですよ。
ただ、自分視点のFPSじゃないので、更にカメラを離すためにマトリックスを掛けて座標変換やら回転変換をする必要があります。
それなら注視点処理方式と手間は変わんないかなって思うわけです。
珈琲 さんが書きました: >これの質問の詳細がわからないので何の座標・角度・倍率の話か説明してもらえますか?
えーと、モデル全般というか、共通した一般的なデータの持ち方というのはないのでしょうか?

今までだったら

コード:

class base{
 int handle;
 int x;
 int y;
 int z;
 int angle;
};
と座標を持ってたのが

コード:

class base{
 int handle;
 MATRIX matrix;
};
となるのか

コード:

class base{
 int handle;
};
そもそもモデルハンドル自体にMATRIXの情報が内包しているのでクラスに記述する必要がないとか・・・
DXライブラリは行列から各種データを取り出す関数が豊富?なのでこっちのほうがいい・・?
そうですね。モデルのマトリクスや自前のマトリクスだけで保持するとfloatですので誤差の累積が問題になると思うんですよ。
なので誤差の累積問題を気にしなくて良いならモデルのハンドルだけで問題ないと思います。
注意点として、無駄な情報は出来るだけ持たないほうが良いのですが、情報を節約しすぎて手間が増えプログラムが組みにくくなったら本末転倒です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#7

投稿記事 by 珈琲 » 13年前

なるほど、ありがとうございます。

色々試してみた中下記のコードが予想と違い、カメラがモデルを追いかけません。(初期方向に向いたまま?)
なんというか、座標はそこにあるんですが実際に描画されているモデルは画面中央からどんどん離れていきます。
MV1GetPosition()が取得してくる座標って一体どんなものなのでしょうか?

MATRIXで座標を変換すると、ローカル座標だけ変換されて、外から見る座標は変わらないんじゃないかと思うんですが(はみ出していくような感じ)

コード:

//ループ
		t+=5;
		i+=PHI/180;

		MV1SetMatrix(handle,MMult(MGetRotY(i),MGetTranslate(VGet(t,0,0))));

		MV1DrawModel(handle);

		SetCameraPositionAndTarget_UpVecY(VGet(5000,5000,5000),MV1GetPosition(handle)); 

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

Re: カメラの向きを指定した方向へ向かせたい

#8

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

MV1SetMatrix()した情報はMV1GetMatrix()する以外に情報が得られません。
MV1GetPosition()するためには、,MV1SetPosition()が必要です。
つまり、2つの情報は独立していてMV1SetMatrix()が優先されて表示に使われています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#9

投稿記事 by 珈琲 » 13年前

うーん・・?
では、
MV1SetPosition
MV1GetPosition
MV1SetScale
MV1GetScale
MV1SetRotationXYZ
MV1GetRotationXYZ

の6つの関数を使用する、もしくは

MV1GetMATRIX
MV1SetMATRIX

の2つの関数を使用するかの2つに1つに絞ったほうがいいのでしょうか
という質問を思いついたのですが
http://homepage2.nifty.com/natupaji/DxL ... html#R3N11
> この関数は MV1SetPosition 関数や MV1SetScale や MV1SetRotationXYZ関数などの代わりに行列を使用してローカル → ワールド座標変換を行いたい場合に使用します。

って書いてありました・・・

先のコードでMV1DrawModel関数で描画する時にも
>以後 MV1SetPosition や MV1SetScale 等の関数の設定は無視され
と書いてあるので、MV1SetPosition関数が使用されていれば、止まって見えたはず
と思って試しにコードを書こうと思ったのですが
MV1GetMatrix()

SetCameraPositionAndTarget_UpVecY()
の型が合わず変換もできません
自力で計算してSetCameraViewMatrix()を使わないとダメですか?

というか、
MV1GetMatrix()の
概略 モデルの座標変換用行列を取得する
ってモデルの現在の座標・角度・拡大率のMATRIXを取得するって意味であってますよね・・?
取得したものをそのまま別のモデルにMV1SetMatrix()すると同じ位置に同じ角度で同じ拡大率で描画できる、ってことですよね

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

Re: カメラの向きを指定した方向へ向かせたい

#10

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

MV1GetMatrix()はMV1SetMatrix()したマトリクスを取得します。それ以下でもそれ以上でもありません。
つまり、MV1SetPosition()の情報とは完全に独立しています。試して頂ければ分かります。
ちなみに、MV1SetMatrix()してしまうとMV1SetPosition 関数や MV1SetScale や MV1SetRotationXYZ関数の情報は無視されます。
MV1SetMatrix()してしまうとMV1SetPosition()をしても座標をモデルハンドルに保存してもらう以外の意味はありません

もう一つの質問は、
>MV1SetMatrix()しているならMV1GetMatrix()可能です。
>原点座標にMV1GetMatrix()で得たマトリクスを適用すると注視点の座標を求めることもできます。
>管理しやすい方で構わないと思います。

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

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#11

投稿記事 by 珈琲 » 13年前

うーん・・・では、MV1SetMatrix()で設定したモデルの座標を取得したい場合はどうすればいいのでしょうか?

MV1SetMatrix( handle );
VECTOR position = VTransform( VGet(0,0,0) , MV1GetMatrix( handle ) );
↑こんなの考えてたんですが・・



>MV1SetMatrix()してしまうとMV1SetPosition()をしても座標をモデルハンドルに保存してもらう以外の意味はありません
つまりDXライブラリでは、モデルハンドルの中に行列とはまた別にもう一つの座標を持っているのですか?
ハンドルで処理する時に行列に変換して描画や計算をしていて、
MV1SetMatrix()されたらフラグが切り替わって、という感じでしょうか

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#12

投稿記事 by 珈琲 » 13年前

あ、独立しているって仰っていましたね
鳥頭ですいません

後半の質問は忘れてください

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

Re: カメラの向きを指定した方向へ向かせたい

#13

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

珈琲 さんが書きました:うーん・・・では、MV1SetMatrix()で設定したモデルの座標を取得したい場合はどうすればいいのでしょうか?

MV1SetMatrix( handle );
VECTOR position = VTransform( VGet(0,0,0) , MV1GetMatrix( handle ) );
↑こんなの考えてたんですが・・
それでうまくいきませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#14

投稿記事 by 珈琲 » 13年前

いえ、確かにこれで動いたのですが、わざわざVTransform()の引数にVGet(0,0,0)を入れるのはスマートじゃないなと思いまして
ややこしい質問の仕方ですみませんでした

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

Re: カメラの向きを指定した方向へ向かせたい

#15

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

その方法が分かりやすいと私は思うんですが、珈琲さんの美学に反するのであればわかり易い名前の関数にしてみたらどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: カメラの向きを指定した方向へ向かせたい

#16

投稿記事 by 珈琲 » 13年前

美学というよりは遠回りしていない方法だと確信が持てなくて質問させて頂きました。
疑問が無くなったので解決とさせて頂きます。

softyaさん朝から晩までありがとうございました、助かりました!

閉鎖

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