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


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

Я смотрю на сложный объект с помощьюQMatrix4x4 камеры persepective так:

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);

Что не так с моим подходом? Как изменить дальнюю плоскость отсечения?


Edit

Я расширил фрагменты кода выше, так как проблема не была видна. Очевидно, моей ошибкой было изменение 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());
1 2

1 ответ:

2 вопроса:

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

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

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

if (left == right || bottom == top || nearPlane == farPlane)    
    return *this;
Таким образом, ваш призыв к фрустрации ничего не делает.

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