В настоящее время я завершаю реализацию камеры, которая функционирует так же, как камера в Maya. Часть, которую я застрял в функциональности падения.Камера Arcball заблокирована при параллельном перемещении вверх
Проблема заключается в том, что функция падения работает нормально, пока положение камеры не параллельна вектору вверх (в настоящее время определено значение (0, 1, 0)
). Как только камера станет параллелью с этим вектором (поэтому он смотрит прямо вверх или вниз), камера фиксируется на месте и будет вращаться вокруг вектора вверх, а не продолжать катиться.
Этот вопрос уже задан here, к сожалению, нет действительного решения проблемы. Для справки, я также попробовал обновить вектор вверх, когда я повернул камеру, но результат в результате не является тем, что мне нужно (просмотр рулонов в результате новой ориентации).
Вот код для моей камеры:
using namespace glm;
// point is the position of the cursor in screen coordinates from GLFW
float deltaX = point.x - mImpl->lastPos.x;
float deltaY = point.y - mImpl->lastPos.y;
// Transform from screen coordinates into camera coordinates
Vector4 tumbleVector = Vector4(-deltaX, deltaY, 0, 0);
Matrix4 cameraMatrix = lookAt(mImpl->eye, mImpl->centre, mImpl->up);
Vector4 transformedTumble = inverse(cameraMatrix) * tumbleVector;
// Now compute the two vectors to determine the angle and axis of rotation.
Vector p1 = normalize(mImpl->eye - mImpl->centre);
Vector p2 = normalize((mImpl->eye + Vector(transformedTumble)) - mImpl->centre);
// Get the angle and axis
float theta = 0.1f * acos(dot(p1, p2));
Vector axis = cross(p1, p2);
// Rotate the eye.
mImpl->eye = Vector(rotate(Matrix4(1.0f), theta, axis) * Vector4(mImpl->eye, 0));
Вектор библиотеки я использую GLM. Вот краткий справочник по пользовательским типам используемых здесь:
typedef glm::vec3 Vector;
typedef glm::vec4 Vector4;
typedef glm::mat4 Matrix4;
typedef glm::vec2 Point2;
mImpl
является Pimpl, который содержит следующие элементы:
Vector eye, centre, up;
Point2 lastPoint;
Редактировать: добавлена недостающая ссылка на аналогичный вопрос. – Mauricio