2009-06-10 4 views
2

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

Что я до сих пор представляю собой очень простую солнечную систему (просто землю, луну и солнце), которая отлично смотрится. Я хочу, чтобы камера следила за той планеткой, которую выбирает пользователь (нажав на желаемую), и чтобы они могли вращаться вокруг планеты на фиксированном расстоянии, используя мышь (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 в carlsverre точка ком)

+0

Что именно преобразует матрицу в камере :: update точно? –

+0

Насколько я понимаю, матрица преобразования должна представлять требуемое вращение сферы в соответствии с классом arcball. Следовательно, если пользователь нажимает одну точку на x, y, z на сфере и перемещает мышь в x2, y2, z2, матрица будет представлять требуемое вращение сферы для перемещения x, y, z в x2, y2, z2. Надеюсь, что имеет смысл. –

ответ

2

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

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

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

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

+0

Эй, спасибо за ответ! Я попытался реализовать то, что вы упомянули так: http://2dsquid.pastebin.com/m510b0130 К сожалению, это не сработало и приводит к тому, что моя камера улетает с моей планеты, пока вся сцена не выйдет из фруста. Может быть, у меня неправильный порядок в умножении ... Любые предложения? –

+0

Итак, я выяснил проблему масштабирования (моя матрица вращения была рассчитана на сфере около 0,0,0, поэтому я менял 1 на много раз) ... Теперь камера sorta вращается вокруг планеты, как будто она должна, за исключением того, что она вращается на скорости света, и если я повернусь влево на некоторое время, а затем попытаюсь повернуть вправо, он будет вращаться влево, пока он не «нормализуется», а затем начнет вращаться вправо.И любое движение вверх/вниз беспорядок все это. Есть идеи? –

+0

Если он вращается слишком быстро, вы должны настроить параметры умножения, чтобы заставить его вращаться медленнее. Я точно не знаю, как вы получаете параметры, но это вопрос «играть» со значениями, чтобы получить желаемый эффект , –

 Смежные вопросы

  • Нет связанных вопросов^_^