Понимание проекционной матрицы OpenGL - PullRequest
1 голос
/ 24 марта 2019

Я писал программу для отображения 3d-моделей с использованием OpenGL, и до сих пор я использовал ортогональную проекцию, но я хочу переключиться на перспективную проекцию, чтобы при приближении камеры к модели она становилась больше.Я понимаю, что мне нужно умножить три матрицы (модель, представление и проекция) вместе, чтобы правильно применить все мои преобразования.Как вы можете видеть в следующем коде, я попытался это сделать и смог правильно создать модель и просмотреть матрицы.Я знаю, как они работают правильно, потому что, когда я умножаю модель и вижу проекции вместе, я могу вращать и перемещать объект, а также изменять положение и угол камеры.Моя проблема в том, что когда я умножаю этот продукт на матрицу проекции, я больше не вижу объект на экране.

Значение по умолчанию для структуры камеры здесь - {0,0, -. 5}, но яманипулируйте этим значением с помощью клавиатуры, чтобы перемещать камеру.

Я использую GLFW + glad и linmath.h для математической матрицы.

    //The model matrix controls where the object is positioned. The
    //identity matrix means no transformations.
    mat4x4_identity(m);
    //Apply model transformations here.

    //The view matrix controls camera position and angle.
    vec3 eye={camera.x,camera.y,camera.z};
    vec3 center={camera.x,camera.y,camera.z+1};
    vec3 up={0,1,0};
    mat4x4_look_at(v,eye,center,up);

    //The projection matrix flattens the world to 2d to be rendered on a
    //screen.
    mat4x4_perspective(p, 1.57, width/(float)height, 1,10); //FOV of 90°
    //mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);

    //Apply the transformations. mvp=p*v*m.
    mat4x4_mul(mvp, p, v);
    mat4x4_mul(mvp, mvp, m);

1 Ответ

3 голосов
/ 24 марта 2019

Когда установлена ​​матрица перспективной проекции, то задается расстояние до ближнего плана и дальней плоскости. В вашем случае это 1 для ближней плоскости и 10 для дальней плоскости:

mat4x4_perspective(p, 1.57, width/(float)height, 1,10);

Модель обрезана ближней плоскостью. Модель должна быть в отсеке.
Координаты пространства глаза в усечении камеры (усеченная пирамида) отображаются в куб (нормализованные координаты устройства). Вся геометрия, которая не входит в объем усеченного конуса, ограничена.

Это означает, что расстояние от модели до камеры должно быть больше, чем расстояние до ближней плоскости (1), и меньше, чем расстояние до дальней плоскости (10).

Поскольку вы можете «видеть» модель, когда вы не используете матрицу проекции, фактическое расстояние до модели находится в диапазоне [-1, 1] (нормализовать пространство устройства). Обратите внимание, что если вы не используете матрицу проекции, то матрица проекции является единичной матрицей. Это ведет себя как ортографическая проекция с расстоянием в ближней плоскости -1 и расстоянием в далекой плоскости 1.

Измените положение камеры для решения проблемы:

, например

vec3 eye    = {camera.x, camera.y, camera.z - 5}; // <--- 5 is in range [1, 10] 
vec3 center = {camera.x, camera.y, camera.z};
vec3 up     = {0, 1, 0};
mat4x4_look_at(v, eye, center, up);
...