Я пытаюсь установить дальнюю плоскость отсечения на более высокое значение, но я немного растерялся.
Я смотрю на сложный объект, используя QMatrix4x4 камера в таком виде:
glMatrixMode(GL_MODELVIEW);
m_view = QMatrix4x4();
m_view.lookAt(QVector3D(17.f, 36.f, 36.f), // eye
QVector3D(17.f, 0.f, 19.f), // center
QVector3D( 0.f, 0.f, -1.f)); // up
glLoadMatrixf(m_view.data());
Теперь, с этой точки зрения, мой объект обрезается дальним самолетом.
Я попытался увеличить дальнюю плоскость, используя усеченный матричная операция с огромным значением. Все, что я хочу, это изменить заднюю плоскость отсечения:
m_view.frustum(1.f, 1.f, 1.f, 1.f, 1.f, 200000.f);
Но это не показывает никакой разницы, модифицируя farPlane
Параметр ничего не меняет. То же самое относится и к орто:
m_view.ortho(1.f, 1.f, 1.f, 1.f, 1.f, 200000.f);
Или же перспективы:
m_view.perspective(0.f, 1.f, 1.f, 200000.f);
Что не так с моим подходом? Как изменить дальнюю плоскость отсечения?
Я расширил фрагменты кода выше, так как проблема не была видна. Очевидно, моей ошибкой было изменение GL_MODELVIEW
вместо GL_PROJECTION
,
Рабочий код должен выглядеть так:
// Projection
m_projection = QMatrix4x4();
m_projection.perspective(20.f, m_width / m_height, 0.01f, 2000.f); // note the far plane
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(m_projection.data());
// Model view
m_view = QMatrix4x4();
m_view.lookAt(QVector3D(17.f, 36.f, 36.f), // eye
QVector3D(17.f, 0.f, 19.f), // center
QVector3D( 0.f, 0.f, -1.f)); // up
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m_view.data());
2 вопроса:
Вы смешиваете операции просмотра модели (lookat) и проекции (frustum) в одной матрице. Вам нужно 2 разных матрицы.
Вы определяете левое и правое значения как 1.f в :: frustum (). Это не может работать, они должны быть разными.
То же самое для верхних и нижних значений.
Вот выдержка из определения QMatrix4x4 :: frustum ():
if (left == right || bottom == top || nearPlane == farPlane)
return *this;
Так что ваш призыв к Frustum ничего не делает.
Если у вас есть подходящие значения для верхнего / левого / верхнего / нижнего, попробуйте поиграть и с расстоянием, близким к плоскости, так как это может быть то, что обрезает ваш объект, а не дальнюю плоскость.
Других решений пока нет …