Как повернуть 3D камеру с помощью GLM

0

Итак, у меня есть класс камеры, у ведьмы есть векторы вперед, вверх и по положению. Я могу перемещать камеру, меняя положение, и я вычисляю ее матрицу следующим образом:

  glm::mat4 view = glm::lookAt(camera->getPos(),
  camera->getTarget(), //Caclates forwards end point, starting from pos
  camera->getUp());  

Вопрос в том, как я могу повернуть камеру, не получая карданный замок. Я не нашел никакой хорошей информации о glm quaternion или даже кватернионе в 3d-программировании

Теги:
opengl
3d
glm-math
quaternions

1 ответ

1
Лучший ответ

glm делает кватернионы относительно легкими. Вы можете инициировать кватернион с glm :: vec3, содержащим ваши углы Эйлера, например glm :: fquat (glm :: vec3 (x, y, z)). Вы можете повернуть кватернион другим кватернионом путем умножения (r = r1 * r2), и это происходит без карданного замка. Чтобы использовать кватернион для создания вашей матрицы, используйте glm :: mat_cast (yourQuat), который превращает его в вращательную матрицу.

Итак, предполагая, что вы создаете 3D-приложение, сохраните свою ориентацию в кватернионе и вашей позиции в vec4, затем, чтобы сгенерировать матрицу View, вы можете использовать vec4 (0,0,1,1) и умножить это на которая генерируется вашим кватернионом, а затем добавляет его в позицию, которая даст вам цель. Вектор вектора может быть получен путем умножения матрицы кватернионов на vec4 (0,1,0,1). Скажи мне, если у тебя больше вопросов.

По двум другим вопросам. Предполагая, что вы используете opengl, а ваша ось Z - передняя ось. (Положительный X удаляется от пользователя.)

1). Чтобы преобразовать вектор вперед, вы можете вращаться вокруг оси Y и X на вашем кватернионе. Например glm :: fquat (glm :: vec3 (rotationUpandDown, rotationLeftAndRight, 0)). и умножить это на ваш кватернион ориентации.

2). Если вы хотите катить, найдите, на каком компоненте находится ваша передняя ось. Поскольку вы, кажется, используете openGL, эта ось, скорее всего, ваша положительная ось Z. Поэтому, если вы хотите перевернуть, glm :: quat (glm :: vec3 (0,0, rollAmt)). И умножьте это на свой кватернион ориентации. ориентация = rollquat * ориентация.

Примечание :: Вот функция, которая может вам помочь, я использовал ее для своих камер. Сделать кват, которые преобразуют один вектор в другой, например один вектор вперед в другой.

//Creates a quat that turns U to V
glm::quat CreateQuatFromTwoVectors(cvec3 U, cvec3 V)
{
    cvec3 w = glm::cross(U,V);
    glm::quat q = glm::quat(glm::dot(U,V), w.x, w.y, w.z);
    q.w += sqrt(q.x*q.x + q.w*q.w + q.y*q.y + q.z*q.z);
    return glm::normalize(q);
}
  • 0
    Это похоже на работу! Еще два вопроса: 1) Как я могу повернуть вектор вперед в соответствии с ориентацией (чтобы сработало движение)? 2) Как я могу повернуть камеру (повернуть вверх-вектор)?
  • 0
    Я отредактировал свой ответ выше, чтобы ответить на два ваших вопроса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню