1-й параметр QMatrix4x4::perspective
- это угол вертикального поля в градусах.Если угол равен 0, поле зрения бесконечно мало, это точка.Для примера используйте 90.0 градусов.
Параметр 3d - это расстояние до ближней плоскости, а четвертый параметр - это расстояние до дальней плоскости.Ближняя и дальняя плоскость определяют предел поля зрения.Вся геометрия должна быть в этой области.Таким образом, в вашем случае значение ближайшего равно 0,1 , а дальнее значение равно 100,0 .
Поскольку ось z указывает на область просмотра в области просмотра, вы должны установить перемещение z, которое больше -0,1 и меньше * -100.0.
Поскольку объем вида в перспективной проекции является усеченной (усеченной пирамидой), количество сдвига x nad y в проекции o области просмотра, зависит от глубины (координата z в пространстве) геометрии и угла поля зрения.Во всяком случае (-5, -5) слишком много с этой настройкой и сместит треугольник из вида.Но вы можете использовать (-1, -1), например.
QMatrix4x4 matrix;
matrix.perspective(90.0f, 4.0f/3.0f, 0.1f, 100.0f);
matrix.translate(-1.0, -1.0, -2.0);
this->m_matrix=matrix;
m_program->setUniformValue(m_matrixUniform, m_matrix);
Обратите внимание, что обычно матрица вида используется для определения точки обзора и взгляда на сцену.
Проекцияматрица определяет проекцию 3-мерной сцены на порт 2-мерного представления.В перспективной проекции матрица проекции описывает отображение из трехмерных точек в мире, которые они видят из камеры-обскуры, в двумерные точки видового экрана.
Матрица вида определяет точку обзора и направление обзора.Матрица модели определяет ориентацию масштаба и положение объекта в сцене (мире).
Матрица проекции вида модели представляет собой конкатенацию матрицы проекции, вида и модели и определяет преобразование формы координат вершины.шаг модели для отсечения пространства:
mvp = projection * view * model
В вашем случае это означает:
QMatrix4x4 projection;
projection.perspective(90.0f, 4.0f/3.0f, 0.1f, 100.0f);
QMatrix4x4 view;
view.translate(0, 0, -2.0);
QMatrix4x4 model = this->m_matrix;
QMatrix4x4 mvp = projection * view * model;
m_program->setUniformValue(m_matrixUniform, mvp);
Но обратите внимание, что при перспективной проекции величина смещения зависит от глубины объекта, который являетсяперетаскивается в область просмотра.
Если объект находится близко к положению глаза, то перемещение в области просмотра приводит к небольшому смещению положения глаза и цели:
![](https://i.stack.imgur.com/61p6B.png)
Если расстояние от объекта до глаза слишком велико, то перемещение в области просмотра приводит к большому смещению положения глаза и цели:
![](https://i.stack.imgur.com/dmKr1.png)
См. Демонстрационный пример:
![](https://i.stack.imgur.com/HUBtc.gif)
В этом случае сумма будет "равна" с поданнойзрения 90градусы и глубина 1:
QMatrix4x4 projection;
projection.perspective(90.0f, 4.0f/3.0f, 0.1f, 100.0f);
QMatrix4x4 view;
view.translate(0, 0, -1.0);
![](https://i.stack.imgur.com/MZLyC.gif)