Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 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 — полосы определенной ширины и цвета. По умолчанию есть две полосы. Щелкните по этому свойству, и появится окошко, в котором можно ими управлять. Свойства полос:

Свойство Описание
Slices Количество сегментов, из которых состоит полоса, чем их больше, тем выше качество. У всех полос Slices должно быть одинаковое, иначе они будут неправильно состыковываться;
Stacks Количество других сегментов, на качество особо не влияет.
StartAngle Угол, задающий нижнюю сторону полосы. Меняется от -90 до 90;
StartColor Цвет нижней стороны полосы;
StopAngle Угол, задающий верхнюю сторону полосы, также может иметь значения от -90 до 90, должен быть больше StartAngle;
StopColor Цвет верхней стороны полосы. Цвет полосы плавно меняется от StartColor до StopColor.
Options Есть только одна опция sdoTwinkle, она включает и отключает мерцание звезд.
Stars Звезды. Щелкните по этому свойству, появится окошко, в котором можно добавлять, удалять и менять свойства звезд.

 

Свойства звезд:

Свойство Описание
Color Цвет звезды.
Dec Высота над горизонтом в градусах.
Magnitude Размер, чем меньше, тем больше звезда.
RA Сдвиг влево или вправо в градусах.

 

Программно можно добавить определенное количество случайно расположенных звезд:

GLSkyDome1.Stars.AddRandomStars(100, RGB(200,200,150), true);

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

GLEarthSkyDome

GLEarthSkyDome — это GLSkyDome, доработанный так, чтобы он больше походил на земной небосвод. Добавлено солнце и, в зависимости от того, на какой высоте оно находится, меняется освещенность неба. Свойства, отличающиеся от GLSkyDome:

Свойство Описание
DeepColor Цвет нижней части сферы.
ExtendedOptions Есть две опции: esoFadeStarsWithSun — исчезают ли звезды с появлением солнца; esoRotateOnTwelveHours — если она включена, то когда SunElevation достигает значения -90 или 90, то небо переворачивается на 180 градусов
HazeColor Цвет туманной дымки.
NightColor Цвет неба ночью.
SkyColor Цвет неба.
SunDawnColor Цвет солнца на закате.
SunElevation Высота солнца над горизонтом, меняется от -90 до 90.
SunZenithColor Цвет солнца в зените.
Turbidity Размытость неба, меняется от 1 до 120.

GLSkyBox

 

GLSkyBox — это куб, окружающий все объекты сцены, на внутренние грани которого наносятся текстуры земли, неба и облаков.

Свойства:

Свойство Описание
CloudsPlaneOffset Высота облаков.
CloudsPlaneSize Размер панели, на которой рисуются облака.
MatName*** Названия материалов в MaterialLibrary для граней и облаков.
Style Какая часть небосвода отображается.

Глава 15. GLAtmosphere

 

GLAtmosphere — это полусфера, которая нужна для создания эффекта атмосферы вокруг планеты. Однако его можно приспособить под отображение, например, силовых полей, но только шарообразной формы. Компонент представляет собой шар с двумя смешанными цветами, внутри находится сфера — «планета». Создаётся GLAtmosphere в Environment objects.

Основные свойства:

Свойство Описание
AtmosphereRadius, PlanetRadius Радиусы атмосферы и планеты, их разница будет толщиной атмосферы, от которой напрямую зависит плотность освещения.
BlendingMode Режим смешивания: по прозрачности или по цвету.
HightAtmColor Внешний цвет атмосферы (задавать нужно вручную, выпадающий список не работает).
LowAtmColor Внутренний цвет, атмосферы (аналогично).
Оpaсity Степень непрозрачности.
PlaneRadius Радиус ядра (сферы по центру).
Slices Количество «долек»
Sun Его задать обязательно, иначе GLAtmosphere не отобразится. Определяет, относительно какого объекта определять верх и низ. Верх будет окрашен в светлый цвет, низ — в темный.

 

Демку можно посмотреть в стандартной папке Demos по адресу Demos\specialsFX\Atmosphere.

 


Глава 16. Системы частиц

Огонь

 

Огонь моделируется системой частиц — партиклов (particle). Создайте стандартный проект, поместите на форму GLFireFXManager и в его свойство Cadencer поставьте работающий GLCadencer1. У объекта, который вы хотите сделать горящим, выберите свойство Effects. В появившемся окне нажмите кнопку + и добавьте FireFX, а у него в свойстве Manager выберите GLFireFXManager1. Теперь объект загорится.

Свойства огня настраиваются и в GLFireFXManager:

Свойство Описание
FireBurst Скорость горения.
FireCrown Чем больше этот параметр, тем большие расстояния от объекта будет захватывать огонь.
FireDensity Чем больше этот параметр, тем чётче прорисованы частички огня.
FireDir Направление, куда сносятся частички огня, как бы огонь сдувается ветром.
FireEvaporation Если это свойство меньше 1, то партиклы сплющиваются по вертикали, если больше 1, то вытягиваются.
FireRadius Радиус огня.
InitialDir Направление огня.
InnerColor Цвет в центре частичек.
OuterColor Цвет на краях частичек.
ParticleInterval Частота появления частиц, чем меньше — тем чаще.
ParticleLife Время жизни партиклов.
ParticleSize Размер частиц.

 

Программно назначить огонь можно так:

TGLBFireFX(GLCube1.AddNewEffect(TGLBFireFX)).Manager:=GLFireFXManager1

Это всё! Теперь можно играться с параметрами для достижения приемлимой производительности и хорошего качества. Чтобы было удобнее это делать, скачайте эту программу:

http://glscene.ru/download.php?view.328

GLFireFXManager — не самый скоростной компонент, поэтому вместо него лучше использовать общие системы частиц.

Молния

 

Поместите на форму GLThorFXManager , в его свойство Cadencer поставьте GLCadencer1. У объекта, из которого будет идти молния, выберите свойство Effects. В появившемся окне нажмите кнопку «+» и добавьте ThorFX. У этого эффекта в свойстве Manager выберите GLThorFXManager1. Все.

Свойства молнии настраиваются в GLThorFXManager:

Свойство Описание
Target Координаты относительно источника молнии, куда будет бить молния.
GlowSize Размер молнии.
Wildness Амплитуда.
Vibrate Изломанность.
MaxPoints Максимально количество узлов.

Визуально редактировать параметры можно в этой программе: 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) —

это имитация бликов от источника света, которые обычно возникают при съемке на видеокамеру.

Свойство Описание
Elements Отображаемые элементы бликов: feGlow — переводится как жар, по исполнению это большой круглый спрайт с плавно меняющимся от центра к краю цветом. Он всегда остается полупрозрачным, даже если альфа канал равен 1; feRing — кольцо; feStreaks — длинные лучи; feRays — короткие лучи; feSecondaries — несколько круглых бликов, их центры находятся на одной линии, выходящей из LensFlare.
GlowGradient Плавное изменение между FromColor в центре и ToColor с краю.
NumSecs Количество Secondaries.
NumStreaks Число длинных лучей.
RaysGrasient Задается цвет коротких лучей.
Resolution Качество прорисовки — чем меньше этот параметр, тем ниже качество, но выше скорость.
RingGradient Градиентное изменение цвета от центрального радиуса FromColor к крайним ToColor.
SecondariesGradient Цвет коротких лучей.
Squeeze Сплющенность. Если меньше 1, то растягивается по горизонтали, если больше 1, то растягивается по вертикали.
StreakAngle Угол поворота лучей.
StreaksGradient Плавное изменение между цветом FromColor в центре и ToColor на кончиках лучей.
StreakWidth Толщина лучей.

 

Визуальный редактор: 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:

Свойство Описание
BlurDeltaTime Время, через которое делаются копии изображения.
Material. FrontProperties. Diffuse. Alpha Размытость изображения.
BlurBottom, BlurLeft, BlurRight, BlurTop Задают смещение изображения
Intensity Интенсивность. Должна быть меньше 1!

По нему тоже есть стандартная демка: Demos\specialFX\motionblur.


Глава 18. Растительность

 

Деревья можно создавать через объект GLTree (Doodad objects — GLTree). Он предназначен для использования в стратегиях — дальность камеры обеспечит неплохой вид за минимум усилий. Несмотря на название, этот объект можно использовать и для создания кустарников. Основные свойства.

Свойство Описание
BranchAngle искривление ствола
BranchAngleBias cмещение веток, чем меньше значение, тем ближе друг к другу ветки
BranchFacets определяет, насколько «дёшево» будет рисоваться ствол
BranchMaterialName имя материала, которым будет обтянут ствол
BranchNoise увеличивает разброс веток и листьев друг от друга и между собой
BranchRadius радиус ствола
BranchSize размер дерева
BranchTwist чем больше параметр, тем крона плотнее
CenterBranchConstant количество листвы
LeafBackMaterial материал, который будет натягиваться на заднюю часть листика. (Все материалы создаются в GLMaterialLibrary)
LeafMaterialName имя материала, который будет натягиваться на переднюю часть листика
LeafSize размер каждого листика
LeafThreshold количество листвы на дереве

Если смотреть на компонент «изнутри», то стоит отметить использование вершинных массивов для оптимизации. И ещё одно — судя по комментариям в модуле 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.22.68.228 (0.009 с.)