Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по GLScene.doc
Скачиваний:
255
Добавлен:
16.12.2018
Размер:
7.18 Mб
Скачать

Глава 11. Прокси объекты.

Если нужно использовать много одинаковых объектов, то лучше не создавать их все по отдельности, а создать лишь один базовый объект, а для каждой его копии делать proxy. Таким образом, можно значительно повысить FPS. Так же рекомендуется для снижения нагрузки на компьютер использовать для объектов, находящихся далеко от камеры, спрайты. Для ещё большего снижения нагрузки, в добавок к перечисленному, можно использовать шейдеры.

В GLScene присутствуют семь компонентов для создания и использования proxy объектов. Это GLProxyObject, GLColorProxy, GLFreeFormProxy, GLMaterialProxy, GLActorProxy, GLMultiProxy и GLMaterialMultiProxy.

GLProxyObject служит для копирования примитивов.

GLFreeFormProxy служит для копирования FreeForm.

GLActorProxy используется для копирования GLActor. Здесь же стоит отметить, что анимация GLActor повторяется на всех его proxy объектах.

GLMultiProxyObject - более передовая версия прокси объектов. Она имеет большие возможности и использует технологию оптимизации LOD (технология LOD описана в главе 11).

Добавлять прокси объект можно через инспектор объектов сцены или объявлять где-нибудь в программе.

Пример:

var pro:TGLProxyObject;

i:integer;

begin

GLFreeForm1.LoadFromFile('mushroom.3ds');

GLFreeForm1.Scale.Scale(0.2);

GLFreeForm1.Pitch(90);

for i:=1 to 1000 do

begin

pro:=TGLProxyObject.createaschild(GLScene1.Objects);

pro.MasterObject:=GLFreeForm1;

pro.ProxyOptions:=[pooObjects,pooTransformation];

pro.position.x:=0.1*(500-i);

pro.position.z:=-50;

end;

end;

Появится 1000 стоящих в ряд грибов.

Я приведу описание некоторых свойств.

Свойство

Описание

MasterObject

В это свойство записывается объект, который нужно скопировать.

ProxyOptions. pooObjects

Положительное значение определяет, что proxy будет копировать структуру мастер-объекта.

ProxyOptions. pooTransformation

Положительное значение определяет, что proxy будет копировать масштаб, положение и ориентацию в пространстве мастер – объекта.

ProxyOptions. pooEffects

Положительное значение определяет, что proxy будет копировать эффекты мастер-объекта.

Не забывайте, что если нужно загружать формат .3ds, то для этого используется не

TGLFreeForm, а TGLFile3DsFreeForm, работа с которым рассказана в девятой главе.

Глава 12. Создание земной поверхности с glTerrainRenderer.

Один из способов создания поверхности земли – это использование задаётся GLTerrainRenderer (GLScene>Scene objects->Add object->Mesh objects->TerrainRenderer). Особенностью GLTerrainRenderer является то, что он поддерживает некоторые техники оптимизации. Такия как ROAM и LOD. Сейчас я о них немного расскажу.

LOD (Levels Of Detail) — это приём в программировании 3D-графики, заключающийся в создании нескольких вариантов одного объекта с различными степенями детализации, которые переключаются в зависимости от расстояния объекта до виртуальной камеры.

Существуют два стратегических подхода к управлению детализацией: статический и динамический LOD. В первом случае заранее создают упрощенные варианты максимально детализированного объекта. Предположим, что для модели танка, состоящей из 1200 полигонов, достаточно сделать упрощенные варианты из 600 и 300 полигонов. В ходе построения сцены просчитывается удаление модели танка от плоскости проецирования и выбирается вариант, соответствующий дальности.

Статическое управление вызывает эффект «дерганья» изображения при смене детализации объекта. Если уровень LOD близок к граничному значению, иногда возникает циклическая смена моделей с разным уровнем детализации. К тому же приходится обсчитывать несколько разных моделей для одного объекта.

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

ROAM (Real-time Optimally Adapting Meshes). Использует прямоугольный треугольник, который делится на более маленькие треугольники.

I. GLBitmapHDS

Нам понадобится карта высот TGLBitmapHDS из вкладки GLScene Utils на панели инструментов Delphi. Работает это так: в TGLBitmapHDS загружается чёрно-белая картинка, на которой нарисован рельеф. Затем GLTerrainRenderer создаёт землю по этой картинке. TGLBitmapHDS называют картой высот, потому что чем темнее цвет на картинке, тем выше будет холм.

Настраиваем свойства GLTerrainRenderer и TGLBitmapHDS либо в инспекторе объектов, либо программно:

//Максимальный размер карты:

GLBitmapHDS1.MaxPoolSize:=8*1024*1024;

//Загрузка карты высот:

GLBitmapHDS1.Picture.LoadFromFile('имя файла.bmp');

//Свяжем карту высот с Terrain’ом:

GLTerrainRenderer1.HeightDataSource:=GLBitmapHDS1;

//Загрузка текстуры земли: GLTerrainRenderer1.Material.Texture.Image.LoadFromFile('файл текстуры'); GLTerrainRenderer1.Material.Texture.Enabled:=true;

//Повернем Terrain, чтобы земля была горизонтальной:

GLTerrainRenderer1.PitchAngle:= 90;

//Зададим нужный масштаб (третий параметр регулирует высоту холмов):

GLTerrainRenderer1.Scale.SetVector(1,1,0.02);

GLTerrainRenderer рисует ландшафт до бесконечности. Если необходимо ограничить размер карты, поставьте свойство InfiniteWrap объекта GLBitmapHDS в значение False;

II. GLCustomHDS

Код, который накладывает текстуру, содержится в методе StartPreparingData объекта GLCustomHDS. Так вот эта процедура вызывается при инициализации каждого тайла (патча), при этом у тайла есть его координата XLeft / YTop, иначе говоря, цикл обрабатывает все вершины тайла с координатами XLeft / YTop. Из чего, имея некий массив вершин (карту высот) любых размеров, можно отрисовать ее насколько угодно количеств тайлов.

Несуразный пример использования GLCustomHDS можно посмотреть в стандартной папке Demos по адресу Demos\meshes\synthterr