2

方向を表す Up Right と Front の 3 つのベクトルがあります。

glRotatef() で使用できるように、これらを XYZ 角度 (3 つの浮動小数点数) に変換する必要があります。

助けてください

[編集]

正しくレンダリングされていません。ここで露骨なものかどうかわかりますか:pastebin.com/f6683492d

4

2 に答える 2

6

down は up の反対であり、新しい情報を提供することはありません。
あなたの質問はあまり明確ではありませんが、記述したベクトルによって定義される新しい座標ベースへの変換を作成したいということだと思います。これらのベクトルが直交している (それらの間に 90 度がある) 場合、角度を計算して glRotate() を使用するという煩わしさをすべて経験する必要はありません。代わりに、新しいベースのベクトルを変換として直接使用できます。

あなたが持っているベクトルがA(a1、a2、a3) - 上、B(b1、b2、b3) - 右、C(c1、c2、c3) - 前方であるとします。まず、 が完全に直交していない場合は、おそらくいくつかの外積を使用して、それらが直交するようにする必要があります。次に、それらの長さが 1 であることを確認する必要があります。次の行列を作成します。

a1 b1 c1 0
a2 b2 c2 0
a3 b3 c3 0
0  0  0  1

これは、単位ベースから A、B、C によって定義されたベースに移動する回転マトリックスです。このマトリックスを使用する必要があるのは、glMultMatrix() を使用することだけです。最初の試行が機能しない場合は、行列を転置するとおそらく修正されます。


編集再度チェックした後、行列の正しい順序は次のようになります: ベクトル A(ax,ay,az), B(bx,by,bz), C(cx,cy,cz)

ax ay az 0
bx by bz 0
cx cy cz 0
0  0  0  1

これは上記の回答の転置です。また、最初に翻訳なしで動作するかどうかを試してみることをお勧めします。次に、次のようにマトリックスに追加するだけで、翻訳を追加できます。

ax     ay     az     0
bx     by     bz     0
cx     cy     cz     0
pos.x  pos.y  pos.z  1
于 2009-10-01T17:54:59.823 に答える
0
x = acos( dp3( nrm( up ), new vec3( 0, 1, 0 ) ) );
y = acos( dp3( nrm( dir ), new vec3( 0, 0, 1 ) ) );
z = acos( dp3( nrm( right ), new vec3( 1, 0, 0 ) ) );

ここで、dp3 は 3 成分の内積で、nrm は 3 成分のベクトルを正規化し、vec3 は定義どおりに 1 つを構築します。

これにより、持っているベクトルとデフォルトの座標ベース間の角度が得られます。

編集: もちろん、上で指摘したように、適用できる基底行列が既にある可能性が高いです。直交正規化も非常に簡単です。現実的には、私が上で行ったことをあなたがする必要がある時を考えることはできません..しかし..ねえ...それはあなたが求めたものです;)

于 2009-10-01T17:52:48.337 に答える