ページ 11

方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 16:45
by 珈琲
ベクトルAxisZの方向へ向く回転行列を取得したいです。

色々試したのですが難しいです。
どうすればいいでしょうか?

コード:

void CSRMLM2::Update(){

	AxisZ = VNorm(VSub(TargetObject->GetPosition(),Position));//(現在の座標-Targetの座標)を正規化してターゲットへの方向ベクトルを得る?

	Position = VAdd(VScale(AxisZ,20),Position);//ベクトルの方向へ20数値分進む


	MATRIX PredeterminedMatrix = MGetIdent(); //本命マトリクス作成開始

		MATRIX PredeterminedAngle = MGetIdent();//回転マトリクス作成開始

		PredeterminedAngle = MMult(PredeterminedAngle,MGetRotX(AxisZ.x));//ここらへん弄りながらやってたからよくわからない

		PredeterminedAngle = MMult(PredeterminedAngle,MGetRotY(AxisZ.y));

		PredeterminedAngle = MMult(PredeterminedAngle,MGetRotZ(AxisZ.z));

	PredeterminedMatrix = MMult( PredeterminedMatrix, PredeterminedAngle );//本命マトリクスと回転マトリクスを合成

	PredeterminedMatrix = MMult( PredeterminedMatrix, MGetTranslate(Position) );//本命マトリクスと平行移動マトリクスを合成

	Model->SetMatrix(PredeterminedMatrix);//モデルに適用

}

Re: 方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 18:44
by usao
>ベクトルAxisZの方向へ向く回転行列を取得したいです。

それだけでは何をしたいのかはっきりしません.


あるベクトル V が存在していて,
 R * V == AxisZ
となるような回転マトリクスRを求めたい,ということなのでしょうか?
もしそういう話であれば,VとAxisZの外積から,回転軸と回転量の情報が得られそうです.
任意軸周りの回転マトリクスを算出する手段さえ用意できれば,Rを求められるように思います.
(AxisZ周りの回転 に自由度があるので一意には定まらない気はしますが)

Re: 方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 19:50
by 珈琲
AxisZ周囲の自由度については気にしていません。

>あるベクトル V が存在していて,
> R * V == AxisZ
>となるような回転マトリクスRを求めたい,ということなのでしょうか?

というのは、たぶん
http://homepage2.nifty.com/natupaji/DxL ... tml#R11N21

だと思うのですが、90度の制限があるみたいで、試してみたところうまくいきませんでした。

モデルの回転の初期値であるベクトルVGet(0,0,0)からターゲットの方向(VGet(posX,posY,posZ))への回転を求めるのですが、
変数の中身が無限?になっているようで22行目の時点のPredeterminedMatrixの全ての要素(float[4][4])が
-1.#IND000
という値がリソースモニタに表示されていました。

※マトリクスで指定するため、原点からの回転角度を求めたいのでベクトルVGet(0,0,0)からターゲットの方向へ向かせました。自由度による誤差は気にしてません。

Re: 方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 20:41
by softya(ソフト屋)
ベクトル(0,0,0)は長さも方向も持ちませんから、それからの回転を求めることはできません。
(100,0,0)など何かの軸線上にあるベクトルから回転を求めるないとダメです。

【補足】
これでも参考に。角度が分かれば回転マトリクスは作れます。
「C言語関数辞典 - C言語Tips集 2 つのベクトルのなす角を計算する」
http://www.c-tipsref.com/tips/math/o_in ... angle.html

Re: 方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 22:07
by 珈琲
できました!
モデルの方で指定した正面(今回はZ軸+方向)と合わせて
MATRIX PredeterminedAngle = MGetRotVec2(VGet(0,0,1.0f),AxisZ);
とすることで、
AxisZ方向へモデルを回転させることができました。

画像
↑全部のミサイルが自機に向かってる感じ

Re: 方向ベクトルから回転行列を取得したい

Posted: 2013年7月25日(木) 22:07
by 珈琲
ありがとうございました!