Каков простой способ увеличить расстояние до плоскости отсечения в OpenGL?

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

Я смотрю на сложный объект, используя 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

Решение

2 вопроса:

  1. Вы смешиваете операции просмотра модели (lookat) и проекции (frustum) в одной матрице. Вам нужно 2 разных матрицы.

  2. Вы определяете левое и правое значения как 1.f в :: frustum (). Это не может работать, они должны быть разными.
    То же самое для верхних и нижних значений.

Вот выдержка из определения QMatrix4x4 :: frustum ():

if (left == right || bottom == top || nearPlane == farPlane)
return *this;

Так что ваш призыв к Frustum ничего не делает.

Если у вас есть подходящие значения для верхнего / левого / верхнего / нижнего, попробуйте поиграть и с расстоянием, близким к плоскости, так как это может быть то, что обрезает ваш объект, а не дальнюю плоскость.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]