Еженедельник Свет в Интернет

Главная

Новости

Статьи и обзоры
  Горожанин
  Обнинск в Internet
  Web Design
  Hardware
  Software
  Безопасность
  Серфинг
  Игродром
  Relax
  Технологии
  Web-обзор
  Интернет-ликбез
  Опросник
  УП-Технологии
  ART.net

Ссылки

Архив

О нас

Контакты

Форумы


Основатель:
К.Николаенко

Главный Редактор:
С.Коротков

Web Design:
Neutron


Наш спонсор






Порт POPULAR.RU
POPULAR.RU RegionalBanner Network.






Океан


НПП Метра - промышленные электронные автомобильные вагонные весы
Goldy Interior - салон офисной мебели: кабинеты руководителей, мебель для персонала

= Технологии =

"БЛИЦ" ТРЕХМЕРНОГО МИРА

© Сергей Лосев

Продолжение: начало в №№ 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



Copyright © Свет в Internet   Designed by Свет в Internet