Матрицы вращения OpenGL и ArcBall - PullRequest
2 голосов
/ 10 июня 2009

Мне было поручено создать сцену OpenGL, реализующую такие идеи, как простое движение и интерфейс Arcball. Проблема, с которой я сталкиваюсь, связана с матрицей вращения, которую класс NeHe Arcball (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48) вычисляет.

Пока что у меня есть очень простая солнечная система (только Земля, Луна и Солнце), которая выглядит великолепно. Я хочу, чтобы камера следовала за любой планетой, которую выбирает пользователь (щелкнув по той, которую он хочет), и чтобы он мог вращаться вокруг планеты на фиксированном расстоянии с помощью перетаскивания мышью (arcball). Как я сказал в начале, класс 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 at Carlsverre Dot Com)

1 Ответ

2 голосов
/ 11 июня 2009

Ну, может быть, я ошибаюсь, но я думаю, что с вами происходит то, что вы вращаетесь вокруг центра координат, а не вокруг планеты (это то, что вы хотите сделать). Чтобы исправить это, вы должны:

  • Переведите точку, вокруг которой вы хотите повернуть (центр планеты), в центр координат, применяя перевод отрицания своей позиции
  • Вращайте, как вы это делаете
  • Отменить ранее выполненный перевод.

Важно понимать, что вращения выполняются вокруг центра координат, и если вы хотите вращаться вокруг чего-то другого, сначала вы должны переместить эту точку в центр координат.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...