Как убрать вращение из матрицы вида модели, чтобы объект всегда был направлен на камеру? - PullRequest
4 голосов
/ 02 мая 2020

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

({ ссылка })

Оригинал:

| xx xy xz xw |
| yx yy yz yw |
| zx zy zz zw |
| wx wy wz ww |

Вращение удалено:

| 1  0  0  xw |
| 0  1  0  yw |
| 0  0  1  zw |
| wx wy wz ww | 

Мой вершинный шейдер:

#version 450 core

layout (location = 0) in vec3 mesh;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec3 worldPos;
layout (location = 3) in mat4 model;

uniform mat4 proj, view;

out Data
{
    vec2 texCoord;
} outData;

void main()
{
    outData.texCoord = texCoord;

    // Remove rotation so that it always faces the camera

    mat4 mv = view * model;

    mv[0][0] = 1;
    mv[0][1] = 0;
    mv[0][2] = 0;
    mv[1][0] = 0;
    mv[1][1] = 1;
    mv[1][2] = 0;
    mv[2][0] = 0;
    mv[2][1] = 0;
    mv[2][2] = 1;

    gl_Position = proj * mv * vec4(mesh + worldPos, 1);
}

Вращение действительно выполняется удалить, но все спрайты все еще неточно зависят от ориентации камеры. Если я не перемещаю камеру, спрайты находятся в своих правильных положениях, но если я перемещаю их, они «улетают».

Что я делаю не так?

РЕДАКТИРОВАТЬ: если я поверну камеру на 90 градусов влево, они будут в правильном положении.

1 Ответ

4 голосов
/ 02 мая 2020

Ваше предложение неверно. Матрица вида определяет взгляд на сцену. Если вы отменяете компонент поворота матрицы вида, вы изменяете линию обзора.
Необходимо повернуть модель в противоположном направлении вида, чтобы она была обращена к плоскости xy пространств вида.
Противоположное вращение может быть получено путем вычисления матрицы inverse матрицы представления и обнуления компонента перевода. Это означает, что вы должны вычислить обратную матрицу верхнего левого 3x3 матрицы вида:

mat3 invViewRot = inverse(mat3(view));
vec3 pos        = worldPos + invViewRot * mesh;

gl_Position = proj * view * model * vec4(pos, 1.0); 
...