Шаг 39 - Отсечение

Библиотека OpenGL имеет очень удобную функцию для "разрезания" объектов. Чтобы не быть голословным, давайте посмотрим как это сделать. (такая опция часто бывает нужна во всевозможных CAD системах)

Возьмем предыдущий пример, тот самый где рисовалась Quadric-сфера.

Ради интереса сделаем из нее цилиндр, т.е заменим функцию gluSphere на gluCylinder.

Теперь добавим переменную-массив, который будет содержать координаты плоскости отсечения:

GLfloat eq[4];

Заполним этот массив в конструкторе класса:

CExampleView::CExampleView()
{
	// TODO: add construction code here
	m_qObj = gluNewQuadric();
	eq[0] = 0.0f;
	eq[1] = 1.0f;
	eq[2] = 0.0f;
	eq[3] = 0.0f;
	m_bClip = TRUE;
}

(переменная m_bClip это флаг, который меняет значение в обработчике меню, см. предыдущие шаги)

Теперь OnDraw(...):

void CExampleView::OnDraw(CDC* pDC)
{
	CExampleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

	if(m_bClip)
	{
		glClipPlane(GL_CLIP_PLANE0, eq);
		glEnable(GL_CLIP_PLANE0);
	} else
		glDisable(GL_CLIP_PLANE0);

	glColor3f(0.0f, 0.5f, 0.5f);
	gluCylinder(m_qObj, 1.0f, 1.0f, 1.0f, 10, 10);

	SwapBuffers(pDC->m_hDC);
}

Функция glClipPlane собственно задает плоскость отсечения. Первый аргумент говорит какая плоскость будет включена, а второй содержит массив точек. Функция glEnable с аргументом GL_CLIP_PLANE? включает соответствующую плоскость.

В OpenGL очень часто всречается такой механизм задания параметров, когда в некую предопределенную в библиотеке "точку с номером" загружается нужное значение, а потом эта "точка" включается. Почему SGI сделала именно так сказать трудно, но этот подход встречается не только в OpenGL, но и, например, в SGI Digital Media. Судя по всему это "стиль" SGI ;)

(если быть точнее, то этот "стиль" встречается там, где есть ограничение по количеству элементов, например количество источников света)


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