Каков простой способ увеличить расстояние до дальней плоскости отсечения в 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 вопроса:
Вы смешиваете операции modelview (lookat) и projection (frustum) на одной и той же матрице. Вам нужно 2 разных матрицы.
Вы определяете левое и правое значения как 1.F в ::усеченный(). Это не может работать, они должны быть другими. То же самое для верхнего и нижнего значений.
Вот выдержка из определения QMatrix4x4:: frustum ():
Таким образом, ваш призыв к фрустрации ничего не делает.if (left == right || bottom == top || nearPlane == farPlane) return *this;
Как только у вас есть хорошие значения для top / left/top/bottom, попробуйте также играть с расстоянием ближней плоскости, поскольку это может быть тот, который зажимает ваш объект, а не дальняя плоскость.