OpenGL: поворот взгляда по оси камеры в вычислительном шейдере

Я делаю демонстрацию лучевого марша, и у меня проблема с поворотом оси камеры. Я использую кватернионы, чтобы вращать мышь и отлично направлять лучи в этом направлении. Пример проблемы: если я поворачиваюсь на 180° на рысканье и нажимаю W, он движется назад, а не вперед. Я пробовала много вещей, например, перевод, и у меня ничего не вышло.

Мне интересно, не является ли это неправильным способом создания движущейся камеры для алгоритма преобразования лучей.
Функция lookAt:

    vec4 rotor = quatRotor(vec3(0., -1., 0.), -iMouse.x);
    rotor      = quatMult(rotor, quatRotor(vec3(1., 0., 0.), iMouse.y));

    vec3 f     = normalize(center - eye);
    vec3 r     = normalize(cross(vec3(0.0, 1.0, 0.0), f));
    vec3 u     = normalize(cross(f, r));

    float fov    = radians(45);
    vec4 dir     = vec4(normalize(uv.x * r + uv.y * u + f * fov), 1.0);

    mat4 m;
    m[ 0 ][ 0 ] = r.x;
    m[ 0 ][ 1 ] = r.y;
    m[ 0 ][ 2 ] = r.z;
    m[ 1 ][ 0 ] = u.x;
    m[ 1 ][ 1 ] = u.y;
    m[ 1 ][ 2 ] = u.z;
    m[ 2 ][ 0 ] = -f.x;
    m[ 2 ][ 1 ] = -f.y;
    m[ 2 ][ 2 ] = -f.z;
    m[ 3 ][ 0 ] = center.x;
    m[ 3 ][ 1 ] = center.y;
    m[ 3 ][ 2 ] = center.z;
    m[ 3 ][ 3 ] = 1.0;

    dir     = m * dir;
    dir.xyz = quatRotate(dir.xyz, rotor);

    return dir;   

Глаза переменные содержит WASD значение ключей, которые униформа. Их инициализированные значения:vec3(0, 0, -1)для xyz соответственно. Центр является
vec3(0,0,0)а переменная uv - это текущий пиксель, который я рисую.

0 ответов

Другие вопросы по тегам