Получить координаты положения глаза в OpenGL ES - PullRequest
2 голосов
/ 01 мая 2020

В 3D-приложении есть камера c:

float eyeX = 0.0f;
float eyeY = 0.0f;
float eyeZ = 0.0f;
Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ,
        0f, 0f, -4f, 0f, 1.0f, 0.0f)

Затем этот вектор используется для координат глаза в шейдере?:

const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);

Или необходимы дополнительные преобразования ?

Примечание: Прочтите сообщение Что такое координаты пространства глаза? , но у меня все еще есть сомнения, потому что мой затенитель тумана не работает. В этом шейдере вычисляется расстояние от наблюдателя до объекта:

uniform mat4 u_vMatrix;
in vec4 a_position;
out float v_eyeDist;
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);
...
void main() {
    ...
    vec4 viewPos = u_vMatrix * a_position;
    v_eyeDist = sqrt(pow((viewPos.x - eyePos.x), 2.0) + 
        pow((viewPos.y - eyePos.y), 2.0) + 
        pow((viewPos.z - eyePos.z), 2.0));
    ...
}

Заранее спасибо!

Решение : по совету Rabbid76 я использовал длину (), а также матрицу вида модели.

uniform mat4 u_mvMatrix; // model-view matrix
in vec4 a_position;
out float v_eyeDist;
...
void main() {
    ...
    vec4 viewPos = u_mvMatrix * a_position;
    v_eyeDist = length(viewPos);
    ...
}

1 Ответ

1 голос
/ 01 мая 2020

Матрица представления преобразуется из мирового пространства в пространство просмотра. Пространство обзора - это локальная система, которая определяется точкой зрения на сцену. Положение вида, линия взгляда и направление взгляда вверх определяют систему координат относительно мировой системы координат.
Источником пространства обзора является позиция "глаза", таким образом, в пространстве обзора положение «глаз» в (0, 0, 0).

В glsl расстояние до точек можно вычислить с помощью встроенной функции distance. Достаточно вычислить евклидово расстояние составляющих x, y, z ( декартовы координаты ), поскольку w компоненты ( гомогенные) координаты ) равны 1 для обоих векторов. Например:

v_eyeDist = distance(viewPos.xyz, eyePos.xyz);

Поскольку точка обзора (положение камеры) находится в (0, 0, 0) в видном пространстве, достаточно вычислить длину вектора вида, чтобы вычислить расстояние. Расстояние от точки до начала системы координат - это длина вектора до точки. В glsl это можно вычислить с помощью встроенной функции length. В этом случае важно вычислить длину компонентов x, y, z и исключить компонент w. Включение компонента w может привести к неверным результатам:

v_eyeDist = length(viewPos.xyz);
...