3D движение камеры и вращение - PullRequest
0 голосов
/ 11 октября 2018

У меня есть 3D-сцена с тремя одинаково расположенными прямоугольниками, я хочу, чтобы камера могла вращаться вокруг цели камеры и перемещаться в любом направлении, как обычно, как камера в приложении для 3D-моделирования, однако моя настройка работает только тогда, когда мойЦель камеры располагается в исходном положении, всякий раз, когда я перемещаю камеру в любом направлении, положение моей камеры и цель камеры корректно переводятся в новое положение, однако моя камера все еще вращается вокруг начала сцены

, показанное ниже изображениецель моей камеры и вращение в начале координат системы координат enter image description here

на изображении ниже показано, как цель моей камеры смещена влево, однако камера поворачивается относительно начала координат системы координат enter image description here

Ниже приведен мой код для поворота и перемещения камеры на плоскости x / y:

if (event.type == SDL_MOUSEMOTION && leftMouseButtonPressed == true)
{

    New.x = event.button.x;
    New.y = event.button.y;

    delta = New - prev;


    if (delta.x != 0) {

        angleX = delta.x / 2.0f;

        rotMat = glm::mat4(1);
        rotMat =   glm::rotate(rotMat, glm::radians(angleX), up);
        cameraUp = glm::normalize(glm::vec4(up, 1) * rotMat);
        cameraRight = glm::normalize(glm::cross(cameraUp, cameraDirection));
        cameraPos = rotMat * glm::vec4(cameraPos, 1) ;
        cameraDirection = glm::normalize(cameraPos - cameraTarget);

        camera = glm::lookAt(cameraPos, cameraTarget, up);


    }





if (event.type == SDL_MOUSEMOTION && rightMouseButtonPressed == true)
{

    New.x = event.button.x;
    New.y = event.button.y;

    delta = New - prev;


    if (delta.x != 0) {

        delta.x /= 10.0f;

        translateMat = glm::mat4(1);
        translateMat = glm::translate(translateMat, cameraRight * delta.x);
        cameraPos = translateMat * glm::vec4(cameraPos, 1);
        cameraTarget = translateMat * glm::vec4(cameraTarget, 1) ;


        camera = glm::lookAt(cameraPos, cameraTarget , cameraUp);


    }

1 Ответ

0 голосов
/ 11 октября 2018

накапливать горизонтальные и вертикальные углы (рыскание и тангаж);каждый раз, когда они меняются:

  • Создание и кеширование матрицы вращения cameraRot с использованием функции yawPitchRoll.
  • Расчет и кеширование камерынаправления вперед и вверх с использованием этой матрицы:

    cameraDirection = cameraRot * glm::vec3(-1.0f, 0.0f, 0.0f);
    cameraUp = cameraRot * glm::vec3(0.0f, 1.0f, 0.0f);
    

    За исключением вопросов точности с плавающей запятой, они уже будут нормализованы.

  • Положение камеры можно затем рассчитать поиспользование цели:

    cameraPos = cameraTarget - cameraDistance * cameraDirection;
    

    Где cameraDistance - расстояние от цели до камеры.

...