2011-02-04 6 views
0

Upベクトルが別のベクトルと同じ方向を向くように行列を方向付けします。前方ベクトルと右側ベクトルの向きは関係ありません。例えば行列を回転させて、Upベクトルが別のベクトルと同じになるようにします。

matrix4 m; // m.Up = 0, 1, 0 
vector3 v = V3(1,0,0); 

// Then I think I have to get the rotation from m.Up and v 
// And then rotate the matrix accordingly 

しかし、私はどのようにこの藤堂知らないと私は間違っている可能性があります。

+0

これに四元数を使用します。この正確な仕事のための正しいツールです。 –

+0

私は角度が必要ない、軸だけを必要としないので、より速い方法があると思いましたか? –

答えて

3

これは、3つの成分のベクトル(アップ、前方、右)にあなたの行列を分割し、matriciesは

まずするために特に有用である回転問題の一つです。

あなたの希望するベクトルを設定します。そして、前方ベクトルと右側ベクトルが直角になるように調整します。これを行う簡単な方法は、クロス積の使用によるものです。例えば

:D:その後

//Gets a perpendicular vector 
V3 V3::Perp() { 
    V3 perp = v.Cross(NewV3(-1, 0, 0)); 
    if(perp.Length() == 0) { 
     // If v is too close to -x try -y 
     perp = v.Cross(NewV3(0, -1, 0)); 
    } 
    return perp.Unit(); 
} 
//up = Whatever you need 
forward = up.Perp() 
right = cross(up, forward); 

、バックマトリックスと出来上がりにあなたのベクトルプラグ。

1

私が正しく理解していれば、選択したベクトルに行列の軸を設定するだけです。前方ベクトルと右側ベクトルが重要ではないと言っているので、あなたの新しいアップ軸に正規直交である限り、それらを何かに設定してください。

関連する問題