2014-12-09 8 views
0

У меня есть физический симулятор, у которого есть вектор направления, и мне нужно рассчитать вращение объекта, чтобы следовать за ним.Вращение объекта OpenGL с использованием вектора направления и матрицы трансформации

 Vec3f up_vector = Vec3f(0,1,0); 
    Vec3f direction_vector = directionVector(position, previous_position); 
    Vec3f crossproduct = normaliseVector(Vec3f(up[0] * direction[0], up[1] * direction[1], up[2] * direction[2])); 
     Vec3f crossproduct2 = normaliseVector(Vec3f(crossproduct[0] * direction_vector[0], crossproduct[1] * direction_vector[1], crossproduct[2] * direction_vector[2])); 

     rotation = Matrix44f(
     { crossproduct[0], crossproduct[1], crossproduct[2], 0 }, 
     { crossproduct2[0], crossproduct2[1], crossproduct2[2], 0 }, 
     { direction_vector[0], direction_vector[1], direction_vector[2], 0 }, 
     { 0, 0, 0, 1 }); 

     glMultMatrixf(rotation); 

Объект кажется вращаться в правильном направлении, но обращается только на одной оси (выглядит как 2D-объект и не может быть виден из оси х, когда в начале координат). Я не знаю, связано ли это с тем, как работает OpenGL?

ответ

2

Это не выглядит правильным. У вас есть переменные с именем crossproduct, но вы нигде не вычисляете кросс-продукт. Я думаю, что это может кардинально работать, если вы замените свои векторные операции кросс-продуктами, где имя указывает, что они должны быть.

Кроме того, похоже, что вы частично не используете правильные имена переменных. Например, существуют значения, назначенные up_vector и direction_vector, но затем в расчетах используются up и direction.

Использование начального именование, это стало бы:

Vec3f up_vector = Vec3f(0,1,0); 
Vec3f direction_vector = directionVector(position, previous_position); 
// Assuming that directionVector() returns a normalized vector. 
Vec3f crossproduct = normaliseVector(crossProduct(up_vector, direction_vector)); 
Vec3f crossproduct2 = crossProduct(direction_vector, crossproduct); 

Затем построить матрицу с этими векторами, как и прежде. Конечно, это происходит неправильно, если direction_vector указывает точно в том же направлении, что и up_vector. Чтобы сделать это надежным по всем направлениям, вам понадобится специальный случай.

В приведенном выше описании, crossProduct() является стандартным кросс продукта:

Vec3f crossProduct(const Vec3f& v1, const Vec3f& v2) { 
    return Vec3f(v1.y * v2.z - v1.z * v2.y, 
       v1.z * v2.x - v1.x * v2.z, 
       v1.x * v2.y - v1.y * v2.x); 
} 
Смежные вопросы