Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глава 12. Создание земной поверхности с glterrainrendererСодержание книги
Поиск на нашем сайте
Один из способов создания поверхности земли — это использование GLTerrainRenderer (Mesh objects — TerrainRenderer). Особенностью GLTerrainRenderer является то, что он поддерживает некоторые технологии оптимизации, такие как ROAM и LOD. Однако обычно чаще используется GLFreeForm, т. к. он имеет развитые средства проверки пересечений и в нем можно хранить не только одну поверхность, но и здания, деревья и другие объекты. Поверхность создается из прямоугольной плоскости, разбитой на множество треугольников по типу сетки. Затем узлы этой сетки поднимаются на нужную высоту, которую GLTerrainRenderer получает из компонентов HDS (Height Data Source) с вкладки GLScene HDS. Самым распространенным и удобным является GLBitmapHDS . GLBitmapHDS
Работает он так: в него загружается картинка в оттенках серого, на которой нарисован рельеф, причем чем светлее пиксел картинки, тем выше будет соответствующая ему точка. Затем GLTerrainRenderer создаёт поверхность по этой картинке. Создадим поверхность программно: // Максимальный размер карты: GLBitmapHDS1.MaxPoolSize:=8*1024*1024; GLBitmapHDS1.Picture.LoadFromFile('имя файла.bmp'); GLTerrainRenderer1.HeightDataSource:=GLBitmapHDS1; GLTerrainRenderer1.Material.Texture.Image.LoadFromFile('файл текстуры'); GLTerrainRenderer1.Material.Texture.Enabled:=true; // Повернем Terrain, чтобы земля была горизонтальной: GLTerrainRenderer1.Direction.SetVector(0,1,0); GLTerrainRenderer1.Up.SetVector(0,0,1); GLTerrainRenderer1.Scale.SetVector(1,1,0.02);
GLTerrainRenderer бесконечно протяженный ландшафт. Если необходимо ограничить размер карты, поставьте свойство InfiniteWrap объекта GLBitmapHDS в значение False. GLCustomHDS
Код, который накладывает текстуру, содержится в методе StartPreparingData объекта GLCustomHDS . Несуразный пример использования GLCustomHDS можно посмотреть в стандартной папке Demos по адресу Demos\meshes\synthterr. Глава 13. Итоги работы с GLTerrainRenderer и GLFreeForm
Сейчас я хочу подвести итог работы с двумя компонентами GLScene - это GLTerainrenderer и GLFreeForm. Скажу сразу, GLFreeForm обеспечивает большую производительность. Почему так? Для ответа обратимся к истории. GLTerrainRenderer разрабатывался на заре этого века, и это наложило свой отпечаток на всю его работу. Что же было в те далёкие, а может и не столь далёкие времена? Первое, видеокарты обычно имели в распоряжении по 4 МБ памяти и весь ландшафт туда попросту не помещался. Второе, производительность видеокарт была невпример низкая по сравнению с производительностью центральных процессоров. Приходилось отправлять данные туда на обработку. Третие, скорость передачи из видеокарты к остальным частям компьютера и обратно была весьма маленькой. Но делать это всё равно было выгоднее в плане производительности. Со временем ситуация значительно изменилась. А именно: первое, объём памяти на видеокартах теперь исчисляется гигобайтами. Второе, производительность видеокарт значительно превсходит мощности центрального процессора одного ценового диапозона. А вот скорость передачи данных из GPU другим частям компьютера и обратно значительно не увеличилась. Теперь чтобы эффективно использовать ресурсы компьютера необходимо оставить данные на GPU и там же производить обработку. Именно так и делает GLFreeForm. Есть и менее значительные особенности GLFreeForm, но они тоже говорят в его пользу. Одной из таких особенностей является использование технологии Octree. С её помощью можно легко отбросить невидимые части ландшафта. Ещё одна особенность это возможность загрузки созданных в профессиональных редакторах (таких как 3DS MAX) моделей. Ведь там легко можно создать ландшафт по той же карте высот и, например, сразу поместить на него сооружения и растительность. Получается очень удобно. В настоящее время существует альтернативная версия класса TGLTerrainRenderer – это TGLVBOTerrainRenderer, который использует для визуализации ландшафта буфера вершинных массивов и лишён некоторых недостатков. Скачать обновлённый модуль GLTerrainRenderer.pas, в котором содержатся оба класса можно здесь: http://www.glscene.ru/forum_viewtopic.php?8.63630 Единственным недостатком используемого алгоритма является то, что не проводится вообще никаких оптимизаций при отрисовке. Глава 14. Создание неба
В GLScene есть специальные объекты для рисования неба: GLSkyDome , GLEarthSkyDome , GLSkyBox . Все они находятся в инспекторе объектов, во вкладке Environment objects. GLSkyDome GLSkyDome — это небосвод, который имеет вид сферы, окружающей все объекты. Небо создается повернутым на 90 градусов, чтобы это исправить установите свойство PitchAngle=90. Важнейшее свойство это Bands — полосы определенной ширины и цвета. По умолчанию есть две полосы. Щелкните по этому свойству, и появится окошко, в котором можно ими управлять. Свойства полос:
Свойства звезд:
Программно можно добавить определенное количество случайно расположенных звезд: GLSkyDome1.Stars.AddRandomStars(100, RGB(200,200,150), true); Первый параметр определяет количество звезд, второй цвет, третий указывает, где должны быть расположены звезды (true — только над горизонтом, false — по всей сфере). GLEarthSkyDome GLEarthSkyDome — это GLSkyDome, доработанный так, чтобы он больше походил на земной небосвод. Добавлено солнце и, в зависимости от того, на какой высоте оно находится, меняется освещенность неба. Свойства, отличающиеся от GLSkyDome:
GLSkyBox
GLSkyBox — это куб, окружающий все объекты сцены, на внутренние грани которого наносятся текстуры земли, неба и облаков. Свойства:
Глава 15. GLAtmosphere
GLAtmosphere — это полусфера, которая нужна для создания эффекта атмосферы вокруг планеты. Однако его можно приспособить под отображение, например, силовых полей, но только шарообразной формы. Компонент представляет собой шар с двумя смешанными цветами, внутри находится сфера — «планета». Создаётся GLAtmosphere в Environment objects. Основные свойства:
Демку можно посмотреть в стандартной папке Demos по адресу Demos\specialsFX\Atmosphere.
Глава 16. Системы частиц Огонь
Огонь моделируется системой частиц — партиклов (particle). Создайте стандартный проект, поместите на форму GLFireFXManager и в его свойство Cadencer поставьте работающий GLCadencer1. У объекта, который вы хотите сделать горящим, выберите свойство Effects. В появившемся окне нажмите кнопку + и добавьте FireFX, а у него в свойстве Manager выберите GLFireFXManager1. Теперь объект загорится. Свойства огня настраиваются и в GLFireFXManager:
Программно назначить огонь можно так: TGLBFireFX(GLCube1.AddNewEffect(TGLBFireFX)).Manager:=GLFireFXManager1 Это всё! Теперь можно играться с параметрами для достижения приемлимой производительности и хорошего качества. Чтобы было удобнее это делать, скачайте эту программу: http://glscene.ru/download.php?view.328 GLFireFXManager — не самый скоростной компонент, поэтому вместо него лучше использовать общие системы частиц. Молния
Поместите на форму GLThorFXManager , в его свойство Cadencer поставьте GLCadencer1. У объекта, из которого будет идти молния, выберите свойство Effects. В появившемся окне нажмите кнопку «+» и добавьте ThorFX. У этого эффекта в свойстве Manager выберите GLThorFXManager1. Все. Свойства молнии настраиваются в GLThorFXManager:
Визуально редактировать параметры можно в этой программе: glscene.ru/download.php?view.333. В runtime молния создается аналогично огню, только эффект имеет тип TGLBThorFX. Дождь
Для создания «простого» дождя будем использовать систему частиц (PFX renderer). Основной ее недостаток — игнорирование освещения, что заметно при взгляде на дождь сверху. Создайте в сцене GLDummyCube (источник частиц) и GLParticleFXRenderer (Particle Systems — PFX Renderer), а на форме GLPointLightPFXManager из вкладки GLScene PFX и GLCadencer, который подключите к менеджеру. Теперь расположим объекты: GLCamera1 в (0;0;8), а GLDummyCube1 в (0;3;0). Настройки менеджера: ColorInner = (1;1;1;0. 5) полупрозрачность ParticleSize = 0. 1 размер частиц AspectRatio = 0. 07 вытянутость по вертикали Эффекта: InitialVelocity = (0;-5;0) направление вниз PositionDispersion = 5 разброс в пространстве PositionDispersionRange = (1;0;1) область с дождем ParticleInterval = 0. 01 интервал между рождениями частиц — чем меньше, тем плотнее Параметры выставлены. Теперь запишите в GLCadencer такую строчку: GLSceneViewer1.Invalidate; Если этого не сделать, то, т. к. мы ничего не делаем с объектами сцены, частицы будут перерисовываться только если изменять размер формы или задвигать её за пределы экрана. Снег
Делаем то же, что и для создания дождя, только изменим эти настройки менеджера: AspectRatio = 1 снег не сплющен ColorInner = (1;1;1;1) и не прозрачен Здесь тоже надо обновлять GLSceneViewer! Иллюстрации: Дым
Клубы пара создаются с помощью PerlinPFX. Он отличается от PointLightPFX тем, что у PointLightPFX частицы имеют вид просто градиентно залитые кружки, а PerlinPFX к ним добавляется еще случайный шум. Сделаем то же, что и в предыдущих случаях, только с нужным менеджером. У менеджера выставим: Brightness = 0. 2 приглушаем яркость ColorMode = scmFade более мягкая текстура ColorInner = (1;1;1;0. 5) ParticleSize = 1.5 У эффекта: InitialVelocity = (0;0. 5;0) направляем дым вверх ParticleInterval = 0. 005 чем меньше, тем плотнее дым PositionDispersionRange = (4;0;1) разброс вдоль линии 4x1 RotationDispersion = 1 немного вращения VelocityDispersion = 1 отклонение частиц от прямого движения Симпатичный дымок, не правда ли! При большом количестве частиц компонент требует невыносимо много ресурсов! Глава 17. Спецээффекты Блики от источников света
Очень красивый эффект даёт использование GLLensFlare (Special Objects — LensFlare) — это имитация бликов от источника света, которые обычно возникают при съемке на видеокамеру.
Визуальный редактор: http://glscene.ru/download.php?view.332. Этот компонент хорошо кушает ресурсы компьютера! Перед некоторыми объектами LensFlare становится невидимым, чтобы этого избежать, поставьте свойства AutoZTest = false, FlareIsNotOcculed = true. После этого он будет рисоваться как и все объекты, в порядке расположения в иерархии. GLBlur
Этот эффект непосредственно связан с освещением и делает объекты светящимися. Данный эффект не использует шейдеров. Так же учтите, что blur-эффект и bloom-эффект это не одно и тоже! Очень важно знать меру применению GLBlur, т. к. он ресурсоемок. Попробуем создать проект с его использованием. Создайте стандартный проект, переместите камеру в (0; 0; 2). Также создайте куб и GLCadencer, а в OnProgress запишите: GLCube1.TurnAngle:=newTime*90; Теперь добавьте в сцену GLBlur (он в Special objects) и установите у него Preset в pDream. Хорошие примеры вы можете найти здесь: Demos\rendering\Blur и BlurAdvanced. GLMotion blur
Этот эффект обозначает смазывание изображения при движении объекта. Принцип действия заключается в том, что через определенные промежутки времени картинка с экрана копируется в буфер, делается немного прозрачной и добавляется к новой картинке. Вот описание некоторых свойств компонента GLBlur:
По нему тоже есть стандартная демка: Demos\specialFX\motionblur. Глава 18. Растительность
Деревья можно создавать через объект GLTree (Doodad objects — GLTree). Он предназначен для использования в стратегиях — дальность камеры обеспечит неплохой вид за минимум усилий. Несмотря на название, этот объект можно использовать и для создания кустарников. Основные свойства.
Если смотреть на компонент «изнутри», то стоит отметить использование вершинных массивов для оптимизации. И ещё одно — судя по комментариям в модуле GLTree.pas, деревья сделала для нас NVidia (http://developer.nvidia.com/object/Procedural_Tree.html), а разработчики сцены просто повторили то же. Однако реализация является весьма несовершенной. Так, невозможно получить тень; не получается использовать bumpmapping к стволу; у компонента отсутствует анимация как таковая. Поэтому я рекомендую посмотреть это: glscene.ru/forum_viewtopic.php?15.37784.0#38300.
Очень часто в играх самых различных жанров встречается трава. Я приведу несколько ссылок на примеры и статьи, хотя на GLScene делалась только одна.
Пример для GLScene. Отличный метод, хотя сложный в понимании без должного описания. http://www.glscene.ru/download.php?view.254%20%20 Есть статья на эту тему, хотя результатом я не доволен: http://steps3d.narod.ru/tutorials/grass-tutorial.html Вот еще кое-что весьма занимательное: процесс создания прекрасной травки в игре ARMA2: http://www.bistudio.com/developers-blog/arma2-vegetation-progress_en.html И неофициальный перевод этой статьи: http://armedassault.kiev.ua/forums/forum41/thread1234.html Про саму игру ARMA2 смотрите здесь: http://www.ag.ru/games/armed_assault_2 Статья с большим названием — «Рендинг Травы в Реальном Времени с Динамическим Освещением»: http://www.kevinboulanger.net/grass.html
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-19; просмотров: 485; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.251.103 (0.012 с.) |