Главная страница
Навигация по странице:

  • Освещение ландшафта

  • Дополнительная часть

  • ^include

  • Отражения в воде

  • Дополнительные источники информации

  • Московского государственного университета

  • Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница30 из 30
    1   ...   22   23   24   25   26   27   28   29   30
    Раскраска ландшафта

    Чтобы сделать получившуюся модель немного более напоми­нающей ландшафт, ее можно раскрасить. Каждой вершине мож­но сопоставить свой цвет, зависящий от высоты этой вершины. Например, вершины выше определенного уровня можно покра­сить в белый цвет в попытке сымитировать шапки гор, вершины пониже — в коричневый цвет скал, а вершины уровнем еще ни­же— в зеленый цвет травы. Значения «уровней» раскраски по­верхности следует подобрать из эстетических соображений.

    Освещение ландшафта

    Для еще большего реализма и для подчеркивания рельефа осветить модель ландшафта бесконечно удаленным источником света (как бы солнцем).

    Цвет вершин можно задавать через glColor совместно с

    glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

    Туман

    Чтобы усилить (или хотя бы создать) иллюзию больших раз­меров модели и се протяженности, можно воспользоваться эф­фектом тумана. Тип тумана (линейный или экспоненциальный) следует выбрать из индивидуальных эстетических предпочте­ний. Способ создания тумана описан в разделе 5.4.

    Управление

    Элементарное управление движением камеры по клавиатур­ным «стрелочкам». Нажатие на стрелку «вверх»—передвиже­ние по направлению взгляда вперед. «Назад» — по направлению взгляда назад. «Влево», «Вправо» по аналогии, «Page Up», «Page Down» —вверх, вниз, соответственно.

    210 Приложение В. Примеры практических заданий

    В GLUT'e получать нажатия не алфавит­
    но-цифровых клавиш можно через функцию
    glutSpecialFunc(void (*)(int key, int x, int у)), где key — кон­
    станта, обозначающая клавишу (см. в glut.h — GLUT_KEY).
    Функция используется аналогично glutKeyboardFuncQ.

    Дополнительная часть

    Управление мышью

    Движение мыши в горизонтальной плоскости (смещение по оси X) управляет углом поворота направления взгляда в гори­зонтальной плоскости (угол альфа G [0..2-Л"]). Движение мыши в вертикальной плоскости (смещение по оси Y) управляет углом поворота направления взгляда в вертикальной плоскости отно­сительно горизонта (угол бета G [—7г..7г]). Зная оба угла, вектор направления взгляда в мировых координатах вычисляется сле­дующим образом:

    direction_z = sin(6eTa);

    direction_x = соз(альфа) * cos(6eTa);

    direction_y = sin (альфа) * cos (бета);

    а затем нормализуется.

    Вектор направления «вбок» вычисляется как векторное про­изведение вектора направления вертикально вверх, то есть век­тора (0, 0,1) и уже известного вектора направления взгляда.

    Вектор направления «вверх» вычисляется как векторное про­изведение вектора направления взгляда и вектора направления «вбок».

    Положение камеры в OpenGL можно передать с помощью ко­манды gluLookAtQ. Подсказка: параметр target можно положить равным position + direction.

    Смещение позиции камеры должно происходить не на фик­сированное расстояние за один кадр, а вычисляться, исходя из

    В.З. Интерактивный ландшафт

    211

    скорости передвижения камеры, и времени, ушедшего на обсчет последнего кадра. Передвижение камеры должно осуществлять­ся в направлении взгляда. Скажем, по левой кнопке мыши — вперед, а по правой — назад. Для того, чтобы засечь время, можно воспользоваться функцией timeGetTimeQ, описанной в «mmsystem.h», и реализованной в библиотеке «winmm.lib» (толь­ко для Windows).

    ^include "mmsystem.h"

    void Display () {

    int system_time_before_rendering ; system_time_before_rendering = timeGetTime (); RenderFrame (); int time_spent_rendering_msec =

    timeGetTime () system_time_before_rendering ;

    }"

    В GLUT'e для этого есть специальный вызов (аналогично timeGetTimeQ):

    time = glutGet (GLUT_ELAPSED_TME);

    Вода, или нечто на нее похожее

    При раскраске ландшафта можно добавить еще один, самый нижний «уровень» —уровень воды. Вершины, располагающиеся на этом уровне, можно покрасить в цвет воды — предположи­тельно, синий. Для того, чтобы получившиеся «водоемы» не вы­глядели продолжением поверхности ландшафта, просто покра­шенным в синий цвет, а имели плоскую поверхность, при генера­ции поля высот можно установить порог высоты, ниже которого «опускаться» вершинам запрещается. Если для элемента матри-

    212 Приложение В. Примеры практических заданий

    цы генерируется значение высоты ниже этого порога, элемент инициализируется пороговым значением.

    Объекты

    По ландшафту можно раскидать в художественном беспо­рядке от пятидесяти объектов, встречающихся на ландшафте в обычной жизни, например, домов или деревьев. При этом ель считается деревом, а две равнобедренные вытянутые вертикаль­но грани, поставленные на ландшафт крест накрест и покрашен­ные в зеленый цвет, считаются елью.

    Отражения в воде

    Сделать так, чтобы ландшафт отражался в воде, которая уже должна присутствовать на ландшафте (то есть подразумевается, что это дополнительное задание является развитием дополни­тельного задания 2). Один из вариантов реализации: рассчитав текущую матрицу камеры, отразить ее относительно плоскости воды и изображения ландшафта, не выводя при этом грани по­верхности воды. Затем, пользуясь еще не отраженной матрицей камеры, визуализировать грани поверхности воды полупрозрач­ными. Это создаст иллюзию поверхности воды, сквозь которую видно отражение. Затем, опять же с неотраженной матрицей ка­меры, нужно нарисовать сам ландшафт (этот подход является частным случаем описанного в разделе 8.3).

    Тени

    На этапе раскраски вершин ландшафта (то есть это надо сде­лать один раз, а не каждый кадр) из каждой вершины можно вы­пустить луч, противоположный направлению солнца. Если луч не пересекся с поверхностью ландшафта — раскрашивать как

    В.З. Интерактивный ландшафт

    213

    запланировано, если пересекся — значит данная вершина ланд­шафта находится в тени, и для нее нужно взять менее интен­сивный цвет. Примечание: реализация теней является задачей повышенной сложности (придется писать нахождение пересече­ний луча с гранями, что в общем случае нетривиально).

    Оценка

    Ландшафт

    8 баллов

    Раскраска

    +2 балла

    Управление

    +2 балла

    Управление мышью

    +2 балла

    Объекты

    +3 балла

    Вода

    +4 балла

    Отражение

    +4 балла

    Тени

    +5 баллов

    В таблице указано максимальное число баллов по каждому пункту. Система выставления баллов — гибкая, зависит от прав­доподобности и впечатления от работы.

    Дополнительные источники информации

    http://www.vterrain.org


    Литература

    [9

    Каннингем, С. АСМ SIGGRAPH и обучение машинной гра­фике в Соединенных Штатах. Программирование, 4, 1991.

    Bayakovsky, Yu. Russia: Computer Graphics Education Takes off in 1990s. Computer Graphics, 30(3), Aug. 1996.

    Canningham S. An Evoluing Approach to CG Courses in CS. Graphicon'98 Conference Proceedings, MSU, Sept. 1998.

    Bayakovsky, Yu. Virtual Laboratory for Computer Graphics and Machine Vision. Graphicon'99, Conference proceedings, MSU, Sept 1999.

    Эйнджсл Э. Интерактивная компьютерная графика. Ввод­ный курс на базе OpenGL, 2 изд. Пер. с англ.- Москва, «Ви­льяме», 2001.

    Порев В.Н. Компьютерная графика. СПб., BHV, 2002.

    Шикин А. В., Боресков А. В. Компьютерная графика. По­лигональные модели. Москва, ДИАЛОГ-МИФИ, 2001.

    Тихомиров Ю. Программирование трехмерной графики. СПб, BHV, 1998.

    Performance OpenGL: Platform Independent Techniques. SIGGRAPH 2001 course.

    215

    216

    Литература

    [10] OpenGL performance optimization, Siggraph'97 course.

    [11] Visual Introduction in OpenGL, SIGGRAPH'98.

    [12] The OpenGL graphics system: a specification (version 1.1).

    [13] Программирование GLUT: окна и анимация. Miguel Angel Sepulveda, LinuxFocus.

    [14] The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.

    [15] А. Игнатенко. Однородные координаты. Научно-образовательный интернет-журнал «Графика и Муль­тимедиа». http://cgm.graphicon.ru/content/view/51/61/.

    Предметный указатель

    API, 11

    GLU, Graphics Utility Library,

    26 GLUT, GL Utility Toolkit, 27

    IRIS GL, 12

    OpenGL, 11

    синтаксис команд, 30 оптимизация, 115 особенности, 12 ошибки, 127 приемы работы, 101

    Tao Framework, 157

    Анимация, 20

    Буфер

    глубины, 62, 90 маски, 94 накопитель, 93 очистка, 40

    Граничные модели, 19

    Графический процесс, 18

    Команды GL glAccum, 94 glArrayElement, 50 glBegin, 44 glBindTexture, 80 glBlendFunc, 91 glCallList, 48 glCallLists, 48 glClear, 40 glClearColor, 40 glColor, 42 glColorMaterial, 68 glColorPointer, 50 glCullFace, 46 glDeleteLists, 48 glDepthRange, 64 glDisable, 43 glDisableClientState, 50 glDr aw Arrays, 50 glDrawBuffer, 93 glDrawElements, 51 glEnable, 43

    217

    218

    Предметный указатель


    ^lEnableClientState, 50 ;lEnd, 44 jlEndList, 47 ;lFog, 73 glFrontFace, 45 glGenTextures, 80 glHint, 96 ;lLight, 69 glLightModel, 66 glLoadldentity, 57 glLoadMatrix, 57 ^Material, 67 glMatrixMode, 56 glMultMatrix, 57 glNewList, 47 glNormal, 43 glNormalPointer, 50 glOrtho, 60 glPopMatrix, 57 glPushMatrix, 57 glReadBuffer, 93 glRotate, 59 glScale, 59 jlShadeModel, 42 glStencilFunc, 95 glStencilOp, 95 glTcxCoord, 85 glTexEnv, 83 glTexGen, 85 glTexParameter, 81 glTranslate, 59 glVertex, 31, 41 dVertexPointer, 49

    glViewport, 63

    Команды GLU

    gluBuild2DMipmaps, 79 gluCylinder, 47, 165 gluDisk, 166 gluLookAt, 60 gluNewQuadric, 47 gluOrtho2D, 60 gluPartialDisk, 166 gluPerspective, 61 gluQuadricTexture, 85 gluScalcImagc, 78 gluSphere, 47, 165

    Команды GLUT gluIdleFunc, 135 glut Create Window, 35 glutDisplayFunc, 39, 135 glutlnit, 35, 134 glutlnitDisplaMode, 134 glutlnitDisplayMode, 35 glutlnitWindowPosition, 134 glutlnitWindowSize, 35, 134 glutMainLoop, 35, 136 glutMotionFunc, 135 glutMouseFunc, 135 glutPassiveMotionFunc, 135 glutPostRcdisplay, 40, 136 glutReshapeFunc, 64, 135 glutSolidCone, 167 glutSolidCube, 167 glutSolidDodecahedron, 168 glutSolidlcosahedron, 168 glutSolidOctahedron, 168

    Предметный указатель

    219

    glutSolidSphere, 167 glutSolidTetrahedron, 168 glutSolidTorus, 167 glutWireCone, 167 glutWireCube, 167 glutWireDodecadedron, 168 glutWirelcosahedron, 168 glutWireOctahedron, 168 glutWireSphere, 167 glutWireTetrahedron, 168 glutWireTorus, 167 Команды WGL

    wglCreateContext, 148 wglDeleteContext, 149 wglMakeCurrent, 149 Контекст рисования, 148 Контекст устройства, 146 идентификатор, 146 формат пикселей, 147

    Объемные модели, 19

    Полигональнвю модели, 20

    Экранизация, 18

    Факультет вычислительной математики и кибернетики

    Московского государственного университета

    им. М. В. Ломоносова

    АДРЕС:

    119992, Москва, ГСП-2, Ленинские горы, 1 МГУ, 2-й учебный корпус.

    ТЕЛЕФОНЫ:

    Приемная комиссия: Подготовительные курсы: Вечерняя математическая школа: Подготовительное отделение: Вечернее специальное отделение для лиц с высшим образованием: Международный отдел факультета Интернет-страница ВМиК МГУ

    E-mail факультета ВМиК МГУ:

    939-55-90 932-98-08 939-53-74 939-27-17

    939-17-73

    939-54-55

    http://www.cs.msu.su e-mail: FAO@cs.msu.su cmc@cs.msu.ru

    Информацию о других факультетах МГУ, программах всту­пительных экзаменов, конкурсе и другую информацию можно посмотреть на странице Московского университета:

    http://www.msu.ru

    Ю.М. Банковский, А.В. Игнатенко

    НАЧАЛЬНЫЙ КУРС OPENGL
    1   ...   22   23   24   25   26   27   28   29   30


    написать администратору сайта