Шаг 30 - Построение в пространстве

В этом примере мы посмотрим на то, как установить параметры вида в 3-х мерной системе координат.

Чтобы не быть голословным я предлагаю скомпилить и запустить пример. Разок, другой нажать левую кнопку мыши, а потом раз 9-10 правую кнопку. Что получится вы увидите сами. А вот почему ... сейчас посмотрим. И так функция OnDraw(...) теперь имеет такой вид:

void CExampleView::OnDraw(CDC* pDC)
{
	CRect clientRect;

	CExampleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	GetClientRect(&clientRect);
	glViewport(0, 0, clientRect.right, clientRect.bottom);

	glPushMatrix();
	glFrustum (-1, 1, -1, 1, 3, 10);

	glTranslatef(0.0, 0.0, -5.0);

	glClearColor (0.5, 0.5, 0.75, 1.0);
	glClear (GL_COLOR_BUFFER_BIT);

	glColor3f (1.0, 0.0, 0.5);
	glBegin (GL_TRIANGLES);
		glVertex3f (-1, -1, 0);
		glVertex3f (-1, 1, 0);
		glVertex3f (1, 0, m_Height);
	glEnd();
	glPopMatrix();

	SwapBuffers(pDC->m_hDC);
}

Переменная m_Height задает глубину одной из вершин треугольника, она как обычно объявлена как член класса C...View и изменяется в двух обработчиках OnLButtonDown(...) и OnRButtonDown(...). Но главное в функции OnDraw(...).

Основная последовательность команд заключена между командами glPushMatrix, glPopMatrix. Если не делать этого, то изменения пространства в предыдущем вызове OnDraw будут влиять на преобразования в следующем вызове.

В примере появилась новая команда glFurstum. Эта команда задает как бы параллелепипед в пространстве, в котором будет отображаться наш треугольник. Если треугольник выходит за пределы этого пространства, то он автоматически отсекается (что и происходит если подольше понажимать на правую кнопку).

Как вы помните из курса начертательной геометрии, то существует много видов проекцирования 3D координат в 2D.

В "чистом" варианте OpenGL поддерживает 2 вида проекции: Ортогональную и Перспективную. Разумеется никто не запрещает вам пользоваться другими видами проекций, но для этого вам придется вручную загрузить матрицу проекции. Позже мы посмотрим как это можно сделать.

Параметры glFurstum вполне очевидны: левая, правая, нижняя, верхняя, ближняя, дальняя плоскости отсечения. Последние 2 параметра задают бижнее и дальнее расстояние от глаз наблюдателя.

Если вы посмотрите MSDN по команде glFurstum, то обнаружите, что второй с конца параметр, задающий заднюю плоскость отсечения должен быть не нулевым и положительным. Это важно и об этом не стоит забывать. Связано это с некоторыми формулами OpenGL, в которых просходит умножение или деление far на near (см. MSDN)

И последнее, командой glTranslate мы отодвигаем систему координат на 5 единиц в глубь экрана. Попробуйте сдвинуть на значение меньше 3-х, больше 10, на 3 и на 10.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 28.05.2000