Главная
Новости
Статьи и обзоры
Горожанин
Обнинск в Internet
Web Design
Hardware
Software
Безопасность
Серфинг
Игродром
Relax
Технологии
Web-обзор
Интернет-ликбез
Опросник
УП-Технологии
ART.net
Ссылки
Архив
О нас
Контакты
Форумы
Основатель: К.Николаенко
Главный Редактор: С.Коротков
Web Design: Neutron
|
|
= Технологии =
"БЛИЦ" ТРЕХМЕРНОГО МИРА
© Сергей Лосев
Продолжение: начало в №№ 9(157), 10(158), 11(159), 12(160), 13(161)
ПРОГУЛКИ ПОД ЛУНОЙ
Последняя тема, которой хотелось бы коснуться в разговоре о программировании игр на Blitz Basic, - это создание ландшафтов. Теория и алгоритмы генерации ландшафтов - довольно нетривиальная задача,, в которой, как правило, используются т.н. LOD-методы, а также фрактальная математика (смотри пример из папки Fractal из DirectX SDK 9.0, в котором генерируется некое подобие ландшафта).
В начале статьи уже говорилось о том, что ландшафт обычно раскладывается на несколько составляющих: карта высот, карта текстур и карта освещения (карта теней). Карта высот - это монохромное изображение, в котором цвета определяют высоту ландшафта: чем ярче цвет пиксела, тем выше гора. Размер такого изображения равен степени 2 (32х32, 64х64, 128х126 и т.д.). Если требуются большие размеры, можно создать несколько ландшафтов и расположить их рядом друг с другом. Простейший способ генерации такой карты - Adobe Photoshop с фильтром Clouds (команда меню Filter->Render->Clouds). Впрочем, если требуется ландшафт определенной "конструкции", он создается вручную в любом графическом редакторе с помощью таких инструментов, как кисти или карандаши, или… с помощью специально написанного для проекта редактора. Его суть в общем-то довольно простая: с помощью мыши поднимаются или опускаются фрагменты ландшафта, а затем расставляются объекты. Способ создания карты текстур тоже зависит от типа игры. В простейшем случае можно выделить в карте высот определенные интервалы, и на самые высокие области накладывать текстуру камня, на "прибрежные" - текстуру песка и т.д. Наконец, карта освещения - это чистой воды математика. Нужно по заданным координатам источника света (например, солнца) вычислить, как освещены/затенены горы и равнины. Но довольно общих слов, пора рассмотреть пример.
Загрузка ландшафта (карты высот) в память выполняется с помощью LoadTerrain ( ) (можно создать и пустой ландшафт функцией CreateTerrain ( )). Все дальнейшие действия выполняются уже знакомыми командами: масштабирование - ScaleEntity, наложение текстуры - EntityTexture. И т.д.
; пример от отображения ландшафта
terrainscale=4
ground = LoadTerrain ("heightmap.bmp")
ScaleEntity ground, terrainscale, 1024, terrainscale
EntityTexture ground, rock_texture, 0, 0
EntityTexture ground, ground_texture, 0, 1
TerrainShading ground, True
TerrainDetail ground, 4000, True
PositionEntity ground, 0, 1, 0
В Blitz Basic включено несколько специальных команд для работы с ландшафтом. Так, чтобы изменить высоту точки с координатами X, Z, нужно вызвать команду ModifyTerrain , детализация меняется по TerrainDetail и т.д. При перемещении камеру нужно смещать таким образом, чтобы учитывалась высота холмов. Наконец, для придания большей реалистичности над ландшафтом можно создать небо - "небесную" текстуру, наложенную на шар, или, что выглядит более правдоподобно, т.н. skybox - несколько "мешей", на которых выводятся отдельные фрагменты небосвода. Эти действия выполняются несложной функцией, которая весьма активно работает с вертексами (вершинами), треугольниками и кистями, составляя прямоугольники и накладывая на них текстуры.
Function LoadSkyBox ( )
Local m, b, s
M=CreateMesh ( )
b=LoadBrush ("sky_front.png", 49)
s=CreateSurface (m, b)
AddVertex s, -1, +1, -1, 0, 0:AddVertex s, +1, +1,
-1, 1, 0
AddVertex s, +1, -1, -1, 1, 1: AddVertex s, -1, -1,
-1, 0, 1
AddTriangle s, 0, 1, 2 : AddTriangle s, 0, 2, 3
FreeBrush b
b=LoadBrush ("sky_left.png", 49)
s=CreateSurface (m, b)
AddVertex s, +1, +1, -1, 0, 0 : AddVertex
s, +1,+1, +1, 1, 0
AddVertex s, +1, -1, +1, 1, 1 : AddVertex s, +1, -1,
-1, 0, 1
AddTriangle s, 0, 1, 2 : AddTriangle s, 0, 2, 3
FreeBrush b
b=LoadBrush ("sky_back.png", 49)
s=CreateSurface (m, b)
AddVertex s, +1, +1, +1, 0, 0 : AddVertex s,
-1, +1, +1, 1, 0
AddVertex s, -1, -1, +1, 1, 1 : AddVertex s, +1,
-1, +1, 0, 1
AddTriangle s, 0, 1, 2 : AddTriangle s, 0, 2, 3
FreeBrush b
b=LoadBrush ("sky_right.png", 49)
s=CreateSurface (m, b)
AddVertex s, -1, +1, +1, 0, 0 : AddVertex s, -1, +1,
-1, 1, 0
AddVertex s, -1, -1
-1, 1, 1 : AddVertex s, 1,
-1, +1, 0, 1
AddTriangle s, 0, 1, 2 : Addtriangle s, 0, 2, 3
FreeBrush b
B=LoadBrush ("sky_top.png", 49)
S=CreateSurface (m, b)
AddVertex s, -1, +1, +1, 0, 1 :
AddVertex s, +1, +1, +1, 0, 0
AddVertex s, +1, +1, -1, 1, 0 :
AddVertex s, -1, +1, -1, 1, 1
AddTriangle s, 0, 1, 2 : AddTriangle s, 0, 2, 3
FreeBrush b
ScaleMesh m, 1024, 1024, 1024
FlipMesh m
EntityFX m, 1
Return m
End Function
ЧТО ДАЛЬШЕ?
На этом позвольте закончить. Blitz Basic - стартовый трамплин в мир более серьезных движков и игр. С его помощью можно за короткое время понять, как кодируются игры (даже простые, уровня "Тетриса" или "Арканоида"), какие дополнительные знания из области стереометрии, математики, физики и оптики потребуются и как их применять в конкретных игровых сценах. Если взяться за дело серьезно, то средств Blitz Basic и последующих версий может не хватить или перестанет хватать. Тогда переключайтесь на другие 3D-продукты.
Полезные ссылки:
TrueVision3D - www.truevision3d.com
Revolution3D - www.revolution3d.net
Crystal Space - crystal.sf.net
GLScene - www.glscene.org
|
|