Я хотел бы сделать 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
.
Если бы я это сделал, как бы я правильно поступил с вводом мыши и рассчитал положение и направление камеры по кватерниону?