2

私は、単純な動きや Arcball インターフェイスなどのアイデアを実装する OpenGL シーンの作成を任されています。私が抱えている問題は、NeHe の Arcball クラス ( http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48 ) が計算する回転行列を処理することです。

私がこれまでに持っているのは、見栄えの良い非常に単純な太陽系 (地球、月、太陽のみ) です。私が望むのは、カメラがユーザーが選択した惑星を追跡し (希望する惑星をクリックして)、マウスドラッグ (アークボール) を使用して固定距離で惑星の周りを回転できるようにすることです。冒頭で述べたように、NeHe のクラスは、マウスのクリックとドラッグに基づいて回転行列を生成しています。マトリックスを適用したいのは、カメラの位置です。しかし、そうすると、カメラは地球の周りを回転することなくぐらつくだけです。だから、私は何かステップを逃しているか、自分がやろうとしていることをひどく理解していると推測しています.

これは、私のカメラクラスからのいくつかのコードです。

// transform is the matrix from NeHe's arcball interface
void camera::update(Matrix4fT transform) {
    glm::mat4 transform_m = glm::mat4(0.0f);

    // convert nehe's matrices to GLM matrix
    for(int i=0; i < 4; i++)
        for(int j=0; j < 4; j++)
            transform_m[i][j] = transform.M[i*4+j];

    // apply matrix to the position
    glm::vec4 pos4 = glm::vec4(this->pos, 1.0f);
    pos4 = transform_m * pos4;

    this->pos = glm::vec3(pos4);
}

void camera::apply(planet *target) {
    // called at the beginning of GLPaint
    gluLookAt(this->pos.x,this->pos.y,this->pos.z,       // cam->position
              target->pos.x,target->pos.y,target->pos.z, // moving
              this->up.x,this->up.y,this->up.z);         // (0,1,0)
}

それ以外では、NeHe の関数は適切な場所 (クリック アンド ドラッグ中) で呼び出されます。誰かがこれについて私を助けてくれることを願っています。コードベース全体 (C++ でプログラムされ、QTPanel にプッシュされたもの) を見たい場合は、メールを送ってください。

ありがとう、

Carl Sverre (carl at carlsverre dot com)

4

1 に答える 1

2

まあ、私が間違っているかもしれませんが、あなたに起こっていると思うのは、惑星の周りではなく、座標の中心の周りを回転していることです (それがあなたがやりたいことです)。それを修正するには、次のことを行う必要があります。

  • 回転させたい点(惑星の中心)を座標の中心に変換し、その位置の否定の変換を適用します
  • そのまま回転
  • 以前に行った翻訳を元に戻します。

理解しておくべきことは、回転は座標の中心を中心に行われるということです。別の場所を中心に回転させたい場合は、最初にその点を座標の中心に移動する必要があります。

それが役立つことを願っています。

于 2009-06-10T20:09:58.943 に答える