4

私の問題は次のとおりです。

opengl シーンにネストされたオブジェクトがあり、それらの相対的な位置と向きしかわかりません。

内部オブジェクトの絶対位置と向きを取得するにはどうすればよいですか? 内部オブジェクトのモデルビュー マトリックスを計算することを考えており、その後、現在のマトリックスを取得していますが、それを位置と向きに変換するにはどうすればよいですか? 言い換えれば、2 つの浮動小数点ベクトルにするため、次のコードを呼び出すことができます。

glTranslatef(position.x,position.y,position.z);

glRotatef(alignment.x,1.0f,0.0f,0.0f);
glRotatef(alignment.y,0.0f,1.0f,0.0f);
glRotatef(alignment.z,0.0f,0.0f,1.0f);

前もって感謝します!

4

1 に答える 1

5

オブジェクトのモデルビュー マトリックスがある場合は、次のコードで位置を抽出できます。

// ... Some rotations/translations has been applied
GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
const float position_x = matrix[12];
const float position_y = matrix[13];
const float position_z = matrix[14];

回転はもう少し複雑です。オイラー角を見てください。必要な回転行列は、zyx-one の転置 =>

//c1 = cos(alignment_x)
//c2 = cos(alignment_y)
//c3 = cos(alignment_z)
//s1 = sin(alignment_x)
//s2 = sin(alignment_y)
//s3 = sin(alignment_z)
//matrix[0] = c1 * c2
//matrix[1] = -c2 * s1
//matrix[2] = s2
//matrix[4] = c3 * s1 + c1 * s2 * s3
//matrix[5] = c1 * c3 - s1 * s2 * s3
//matrix[6] = -c2 * s3
//matrix[8] = s1 * s3 - c1 * c3 * s2
//matrix[9] = c3 * s1 * s2 + c1 * s3
//matrix[10] = c2 * c3

ここから実際の角度を抽出するのは、いくつかの特異点があるためかなり厄介です。これらを無視すると、次のようになります。

// Assumes c2 != 0, you'll need more code to handle the special cases
if (matrix[0] != 0.0f || matrix[1] != 0.0f) {
    const float alignment_x = atanf(-matrix[1], matrix[0]);
    float c2;
    if (0 != cosf(alignment_x)) {
        c2 = matrix(0) / cosf(alignment_x);
    } else {
        c2 = matrix(1) / -sinf(alignment_x);
    }
    const float alignment_y = atanf(matrix[2], c2);
    const float alignment_z = atanf(-matrix[6], matrix[10]);
} else {
    alignment_y = atanf(matrix[2], 0);
    //Too tired to deduce alignment_x and alignment_z, someone else?
}

上記のコードはすべて、回転/平行移動のみを使用し、スケーリングや傾斜を使用していないことを前提としています。

最後に、オイラー角は悪だと言って終わりにしましょう。もし私があなただったら、あなたが解決しようとしている問題が何であれ、別の解決策を探すでしょう ;)

/AB

于 2009-11-25T13:28:50.883 に答える