C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  Update World C++: Сборник GPL QT исходников
  Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Нетология

 39 - Отсечение / Open GL / Графика

Шаг 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.
[AD]





Letyshops [lifetime]