5

すべての座標が正の他のすべての軸に対して 45° の角度で原点 O(0,0,0) を指すようにカメラを設定する際に問題があります (もちろん、同じ値を持つ必要があります)。私が持っている最も近い画像で見ることができます

ここに画像の説明を入力

ただし、ご覧のとおり、ここでは値が負であるため、カメラは平面xの反対側にあります。YZ

完全なコンパイル可能なプロジェクトは、このリビジョンの gist にあります。

関連する行列の乗算は次のとおりです。

osg::Matrixd rotate_x(
        1.0, 0.0, 0.0, 0.0,
        0.0, q_cos, -q_sin, 0.0,
        0.0, q_sin, q_cos, 0.0,
        0.0, 0.0, 0.0, 1.0 
);
osg::Matrixd rotate_y(
        q_cos, 0.0, q_sin, 0.0,
        0.0, 1.0, 0.0, 0.0,
        -q_sin, 0.0, q_cos, 0.0,
        0.0, 0.0, 0.0, 1.0 
);
camera_pos = camera_pos * rotate_x;
camera_pos = camera_pos * rotate_y;

ファイルでSimple.cpp

これがどのように機能するかを理解しようとしています(数学的にもプログラム的にも)。openscenegraph にできるだけ依存しないソリューションを好みますが、最初は自分で数学を実行して、それがどのように機能するかを実際に把握したいので、数学側にもっと依存します。したがって、基本的な線形代数の大学のコースでは教えられていない四元数やその他の高度なものはまだありません。

4

2 に答える 2

1

あなたのrotate_yマトリックスは私には反転しているように見えます.

glRotateの回転行列から始めて、結果の行列を xyz = (0,1,0) で単純化し、これを取得しました (列の主要な順序で (標準の OpenGL 表記)

 q_cos  0  q_sin   0 
 0      1  0       0 
-q_sin  0  q_cos   0
 0      0  0       1

ただし、同じ行列を行優先順に指定しています。

osg::Matrixd rotate_y(
        q_cos,  0.0, q_sin,  0.0,
        0.0,    1.0, 0.0,    0.0,
        -q_sin, 0.0, q_cos,  0.0,
        0.0,    0.0, 0.0,    1.0
);

-q_sinマトリックスの要素 [2] であるq_sin必要があり、要素 [8] である必要がありますが、それらを反転したように見えます。


編集


OpenGL と OSG は通常、行列を列優先形式で表します。4x4 行列を見ると、次のように配置されます。

[0]    [4]     [8]     [12]
[1]    [5]     [9]     [13]
[2]    [6]     [10]    [14]
[3]    [7]     [11]    [15]

[0] は配列の最初の要素、1は 2 番目の要素などです。

OSG で行列を作成する場合、[0] から [15] までの 16 個の連続したメモリ要素を定義しています。

osg::Matrixd rotate_y([0], [1], [2]......,[15]);

コマンドを 4 行に分割すると、次のようになります。

osg::Matrixd rotate_y(
   [0], [1], [2], [3],
   [4], [5], [6], [7],
   [8], [9], [10],[11],
   [12],[13],[14],[15] 
)

これが元の列ベクトル表現からどのように転置されているかがわかりますか? インターネットで見つかった 4x4 マトリックスの例は列ベクトルで表されますが、現在それらを行ベクトルとしてアップロードしているため、反転する必要があります。あなたが読んでいるものは「間違っている」という意味ではなく、単に別の表現になっているだけです。

于 2012-07-20T23:51:12.197 に答える
0

回転行列は、原点を中心に点を回転させます。初期位置を(0,0,500)xおよびy回転に設定して適用するため(0,0,500)、原点を中心にacos(q_cos)またはasin(q_sin)ラジアンで点を回転させることになります。

于 2012-07-20T20:31:52.103 に答える