Как изменить кватернион с помощью мыши? - PullRequest
3 голосов
/ 19 сентября 2019

Я хотел бы сделать 3D-просмотрщик, который управляется с помощью мыши с помощью OpenGL.Камера движется вокруг объекта, используя полярную систему координат.Я использую угол Эйлера и glm::lookat, эта система работает с некоторыми ограничениями.В этом случае высота и рыскание должны быть изменены с помощью мыши, однако нам нужно позаботиться о блокировке карданного подвеса.Поэтому я наложил ограничение на диапазон высоты тона.

Это часть кода

auto V = camera.getViewMatrix();
float xOffset = x - lastX_pos;
float yOffset = lastY_pos - y;
lastX_pos = x;
lastY_pos = y;

float sensitivity = 0.05;
xOffset *= sensitivity;
yOffset *= sensitivity;

yaw += xOffset;
pitch += yOffset;

if (pitch > 89.0f)
    pitch = 89.0f;
if (pitch < -89.0f)
    pitch = -89.0f;

glm::vec3 cameraPos;
cameraPos.x = distance * cos(glm::radians(yaw)) * cos(glm::radians(pitch));
cameraPos.y = distance * sin(glm::radians(pitch));
cameraPos.z = distance * sin(glm::radians(yaw)) * cos(glm::radians(pitch));

glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f);
glm::vec3 cameraDirection = glm::normalize(cameraPos);
glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);

V = glm::lookAt(cameraPos + sphereCenter, sphereCenter, cameraUp);
camera.setViewMatrix(V);

Я бы хотел переместить камеру без каких-либо ограничений, таких как просмотрщик Meshlab.Поэтому я думаю, что должен использовать не угол Эйлера, а кватернион и вычислять матрицу вида без glm::lookat.

Если бы я это сделал, как бы я правильно поступил с вводом мыши и рассчитал положение и направление камеры по кватерниону?

...