/*

Демонстрация IFS фракталов.

Для активации управления камерой нажмите ESC.

*/

GLobj cam;

IFS ifs; int fig=l; int maxfig=7;

void example_init()

{

gl.set (5);

// дракон Хартера-Хейтуэя ifs.dragon(); glNewList(1,GL_COMPILE); ifs.draw(); glEndList();

// кривая Коха ifs.koh();

glNewList(2,GL_COMPILE); ifs.draw(); glEndList();

// лист папоротника ifs.fern();

glNewList(3,GL_COMPILE) ; ifs.draw(); glEndList() ;

// лист ifs.leaf ();

glNewList(4,GL_COMPILE) ; ifs.draw(); glEndList () ;

// дерево ifs.tree () ;

glNewList(5,GL_COMPILE) ; ifs.draw(); glEndList() ;

// приведение ifs.ghost () ;

glNewList(6, GL_COMPILE) ; i fs.draw(); glEndList() ;

}

void example_deinit()

{

gl.deinit();

}

// обработка ввода void input()

{

cam.input(&in); switch(in.vkey)

{

// отображаем следующий фрактал case VK_ADD: fig++;

fig%=maxfig; fig= (fig)?fig:1; break;

// отображаем предьщущий фрактал case VK_SUBTRACT: fig--;

fig=(fig)? fig:maxfig-1 ; break; default:;

}

in.vkey=-l;

}

void draw() // вывод сцены {

input();

glLoadldentity();

cam.transform();

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0,1,0);

glCallList(fig);

glEnd();

}

Сцена В примерах этой книги использовался оконный режим. Но в некоторых ситуациях полноэкранный режим предпочтительней. Также бывает полезно сменить текущее разрешение экрана. Все это решается средствами платформы, на которой работает OpenGL. Для смены разрешения нужно заполнить поля структуры DEVMODE и вызвать функцию ChangeDisplaySettings.

DEVMODE scrset;

// можно добавить сохранение позиции и размера окна // заполняем структуру нулями memset(bscrset,0,sizeof(scrset)) ;

scrset.dmSize=sizeof(scrset); // размер структуры // желаемое разрешение по горизонтали scrset.dmPelsWidth=64 0;

// желаемое разрешение по вертикали scrset.dmPelsHeight=4 8 0;

scrset.dmBitsPerPel=32; // количество бит на пиксель // на старых мониторах будьте осторожны с частотой scrset.dmDisplayFrequency=85; scrset.dmFields=DM_BITSPERPELIDM_PELSWIDTH|

DM_PELSHEIGHT|DM_DISPLAYFREQUENCY; ChangeDisplaySettings(iscrset, CDS_FULLSCREEN); Полноэкранный режим имитируется всплывающим окном имеющего размеры экрана. Можно создать новое OpenGL окно со стилем WS_POPUP или изменить стиль функцией SetWindowLong.

Если вы разрабатываете собственный редактор моделей, предусмотрите следующие возможности: движение контура вдоль некоторой кривой, составление объекта из набора базовых моделей, зеркальное отражение объекта.

В сложных динамических сценах встает вопрос о скорости вывода. Правильное использование функций OpenGL может сильно повысить производительность. Кратко перечислим основные моменты.

Для вывода объектов старайтесь использовать списки отображения и массивы OpenGL.

По возможности отключайте обработку освещения, наложения текстур и смешивания цветов.

Старайтесь выводить только те объекты, которые действительно попадают в поле видимости камеры. Обычно для этого вся сцена разбивается на более маленькие трехмерные сегменты. После этого можно воспользоваться режимом выбора и такими технологиями, как BSP деревья и порталы.

По умолчанию OpenGL обрабатывает обе грани многоугольника. Но при выводе таких замкнутых моделей, как сфера или куб, это ни к чему.


⇐ вернуться назад | | далее ⇒