Мне было поручено создать сцену 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)