11

キーで回転させたいオブジェクトがあります。オブジェクトはヨー、ピッチ、ロールする必要があります。いろいろ試してみたところ、glRotate限界があり、その機能でそのようなものを実装することはできないと思いました。

少し調べて、クォータニオンベースの回転について調べました。回転行列を介して回転することも可能ですが、ほとんどの人がクォータニオンをこれまでで最高のものと説明しています。

私はクォータニオンについて読み、それらをかなりよく理解しましたが、OpenGLプログラムでそれらを実装する方法はまだ謎です。誰かが小さな例を知っていますか?クォータニオンクラスの実装方法ではなく、使用方法。物事をまとめる方法がわかりません。

4

2 に答える 2

9

ユニットクォータニオンから回転行列を簡単に作成できます。

ユニットクォータニオンa+bi + cj + dkが与えられると、次の3x3行列を作成できます。

マトリックス

Identity 4x4マトリックスから取得した最後の行と列を追加すると、glMultMatrix完了です:)

于 2011-10-29T10:51:02.020 に答える
4

最も重要なのは、クォータニオンから回転行列を作成するメソッドを実装することです。次に、通常の回転行列で行うように、モデルビュー行列を掛けるだけです。

これは、マウスの動きで立方体を回転させるために使用された単純な例です。ご覧のとおり、私は3つのメソッドを実装する必要がありました:toMatrix、、。クォータニオンを理解していると仮定すると、これはクォータニオンが何をするかを明確にする必要があります。 quaternionFromAxismultiplyWith

void display() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();

    // Multiply quaternion with current modelview matrix    
    glMultMatrixf(cameraQuaternion.toMatrix());

    // Some other transformations
    glTranslatef(-0.5f, -0.5f, -0.5f);

    // Draw something, i.e. cube
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glDrawArrays(GL_TRIANGLES, 0, 36);

    glPopMatrix();
}

void mouseMoved(float dx, float dy) {
    float axisY[] = { 0, 1, 0 },
          axisX[] = { 1, 0, 0 };

    float sensitivity = 0.005f;
    Quaternion *q1 = Quaternion.quaternionFromAxis(axisY, dx * sensitivity];
    Quaternion *q2 = Quaternion.quaternionFromAxis(axisX, dy * sensitivity];

    // Multiply two quaternions with camera
    cameraQuaternion = (q1.multiplyWith(q2)).multiplyWith(cameraQuaternion);
}
于 2011-10-29T11:57:39.687 に答える