Если вы хотите перевести камеру по смещению, то вы должны добавить один и тот же вектор (glm::vec3 offset
) к положению камеры (cameraPos
) и цели камеры (center
):
center = center + offset;
cameraPos = cameraPos + offset;
Когда вы вычисляете новую цель камеры (center
), под углом pitch
и yaw
, вам нужно обновить вектор вверх (cameraUp
) камеры,тоже:
glm::vec3 front(
cos(glm::radians(pitch)) * cos(glm::radians(yaw)),
sin(glm::radians(pitch)),
cos(glm::radians(pitch)) * sin(glm::radians(yaw))
);
glm::vec3 up(
-sin(glm::radians(pitch)) * cos(glm::radians(yaw)),
cos(glm::radians(pitch)),
-sin(glm::radians(pitch)) * sin(glm::radians(yaw))
);
cameraPos = center + front * 5.0f;
cameraUp = up;
Чтобы переместить камеру вдоль оси x (слева направо) в пространстве вида, необходимо рассчитать вектор вправо по Перекрестное произведение векторак цели (front
) и вектору вверх (cameraUp
или up
):
glm::vec3 right = glm::cross(front, up);
Ось Y (снизу вверх) в пространстве обзора является вектором вверх.
Для перевода относительно скаляров (float trans_x
) и (trans_y
), масштабированный вектор right
и up
должен быть добавлен к положению камеры (cameraPos
) и цели камеры (center
):
center = center + right * trans_x + up * trans_y;
cameraPos = cameraPos + right * trans_x + up * trans_y;
Используйте управляемые векторы для установки матрицы вида:
modelViewProjectionMatrix.LookAt(cameraPos, center, cameraUp);