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

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

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

#1

投稿記事 by 珈琲 » 12年前

ベクトル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);//モデルに適用

}

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

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

#2

投稿記事 by usao » 12年前

>ベクトルAxisZの方向へ向く回転行列を取得したいです。

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


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

珈琲

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

#3

投稿記事 by 珈琲 » 12年前

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)からターゲットの方向へ向かせました。自由度による誤差は気にしてません。

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

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

#4

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

ベクトル(0,0,0)は長さも方向も持ちませんから、それからの回転を求めることはできません。
(100,0,0)など何かの軸線上にあるベクトルから回転を求めるないとダメです。

【補足】
これでも参考に。角度が分かれば回転マトリクスは作れます。
「C言語関数辞典 - C言語Tips集 2 つのベクトルのなす角を計算する」
http://www.c-tipsref.com/tips/math/o_in ... angle.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

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

#5

投稿記事 by 珈琲 » 12年前

できました!
モデルの方で指定した正面(今回はZ軸+方向)と合わせて
MATRIX PredeterminedAngle = MGetRotVec2(VGet(0,0,1.0f),AxisZ);
とすることで、
AxisZ方向へモデルを回転させることができました。

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

珈琲

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

#6

投稿記事 by 珈琲 » 12年前

ありがとうございました!

閉鎖

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