В чем разница между трансформацией через матрицу и через кватернион + сложение? - PullRequest
0 голосов
/ 18 мая 2018

Итак, я пытался внедрить конвейер отложенного затенения в мой рендерер openGL, но по какой-то причине интенсивность точечного источника света зависит от вращения камеры.Если я посмотрю в северном направлении, весь мир станет красным.Если я смотрю в южном направлении (к точечному освещению), только радиус вокруг положения источника света становится красным.Пробуя разные вещи, я заметил нечто странное.Чтобы преобразовать положение источника света в пространство просмотра, я преобразую его в 4-мерный вектор, умножив его на viewMatrix камер, а затем отрежу часть w, как сказано в уроке, который я следую, но поскольку это не сработало, я попыталсянекоторые разные методы, которые каким-то образом давали разные результаты, даже если они должны быть в точности одинаковыми.

Здесь я написал отдельную программу для проверки 3 разных методов:

    Vector4f transView = new Vector4f(POSITION);
    Matrix4f viewMatrix = new Matrix4f().identity()
            .rotationX((float) Math.toRadians(56))
            .rotateY((float) Math.toRadians(123))
            .rotateZ((float) Math.toRadians(0))
            .translate(-PLAYER_POS.x, -PLAYER_POS.y, -PLAYER_POS.z);

    transView.mul(viewMatrix);

    Quaternionf rotation = new Quaternionf().identity().rotation((float) Math.toRadians(56), (float) Math.toRadians(123), (float) Math.toRadians(0));
    Vector4f transViewQuat = new Vector4f(POSITION);

    viewMatrix = new Matrix4f().identity()
            .rotate(rotation)
            .translate(-PLAYER_POS.x, -PLAYER_POS.y, -PLAYER_POS.z);

    transViewQuat.mul(viewMatrix);

    Vector4f transQuat = new Vector4f(POSITION);

    transQuat.rotate(rotation).sub(PLAYER_POS.x, PLAYER_POS.y, PLAYER_POS.z, 0);

Результатыявляются:
-16,5228042603 -10,3134384155 8,1627197266 1 (transView)
-12,0040283203 5,5546798706 16,4635715485 1 (transViewQuat)
102,3978881836 -46,5307388306 22,3403549191 (transQuat)

Может кто-нибудь объяснить мне, почему 3 выхода - это 3 совершенно разных результата и почему интенсивность света зависит от вращения камеры?В моей игре я использую первый метод для создания моего viewMatrix.

...