Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! Программирование 3D-игр: Создание неба и красивых рельефов


Школа программирования

179) Программирование 3D-игр: Создание неба и красивых рельефов

Последний выпуск по BlitzBasic, был N 173.

Создание неба

Рассмотрим применение возможностей вращения объектов на примере создания эффекта неба с облаками. Для этого обратимся к текстурам, которые применяются для красивого формирования больших, бесконечных пространств (plane). Прежде всего нам потребуется создать такое пространство:

Graphics3D 640,480

camera = CreateCamera()
MoveEntity camera,0,0,-40

; поверхность
flat = CreatePlane()

grass_tex=LoadTexture( "nebo.bmp" ) ; загрузка текстуры неба
EntityTexture flat,grass_tex

Теперь для того, чтобы в игре появилось небо, достаточно эту поверхность перевернуть - только не на 180 градусов, а на немного меньший угол, иначе она будет параллельна нашему взору и не будет видна.

TurnEntity flat,-160,0,0 ; переворачиваем плоскость

Теперь она покажется как уходящее вдаль к горизонту небо.

Создание красивых рельефных местностей

Для подготовки бесконечных плоскостей мы использовали функцию CreatePlane(). Такую плоскость при желании можно покрыть текстурой:

plane=CreatePlane()
grass_tex=LoadTexture( "media/mossyground.bmp" ) ; текстура травы из примеров
EntityTexture plane, grass_tex

Но она все равно будет показываться как плоскость. Однако в играх действия практически всегда разворачиваются на пересеченной местности. Для создания такой местности (terrain) с различными высотами разных точек применяется команда

LoadTerrain ( file$ )

Она загружает профиль поверхности из графического bmp-файла, выраженность красного цвета (R-составляющая в RGB-цвете) каждой точки которого трактуется как относительная высота (0 - ровно, 255 - максимальная вышина).

Функция возвращает идентификатор загруженной местности.

Важно! Размер картинки из графического файла по ширине и высоте должен быть кратен степени двойки (1024, 128 и т. д. ).

Как и любую другую сущность, местность можно двигать, масштабировать, вращать и т. д.

После создания местности к ней, как правило, прикрепляется текстура.

* Создать ровную квадратную местность (все точки имеют высоту 0) можно командой

CreateTerrain( размер )

Размер должен быть степенью двойки.

* Степень детальности отображения местности в игре задается командой

TerrainDetail terrain, detail_level, vertex_morph

Параметр detail_level - сиcтемное понятие трехмерной графики, задающее число треугольников, с помощью которых данная местность моделируется. Чем больше это число, тем детальнее изображение (точнее аппроксимируются перепады между высотами) и тем медленнее работает программа. По умолчанию задано значение 2000 (резкое снижение качества начинается примерно со значения 1000).

Последний параметр (необязательный) определяет гладкость представления поверхности (vertex morphing), и хотя по умолчанию он имеет значение false, рекомендуется его включать (устанавливать в true), так как современные видеокарты хорошо поддерживают этот режим.

* Узнать относительную высоту некоторой точки можно с помощью функции

TerrainHeight# ( terrain, grid_x, grid_z )

Она возвращает дробное число в диапазоне от 0 (минимальная высота) до 1 (максимальная).

* Интересных эффектов можно добиться с помощью команды

ModifyTerrain terrain, grid_x, grid_z, height#, realtime

Она изменяет высоту точки grid_x,grid_z на новое относительное значение height# (дробное в диапазоне от 0 до 1). Изменение происходит немедленно, если значение последнего параметра realtime равно true, либо после выполнения команды RenderWorld, если false (значение по умолчанию).

* Для пересчета абсолютной координаты игрового пространства в относительную координату местности применяются функции

TerrainX# (terrain,x#,y#,z# ) - x-координата в пределах местности;
TerrainY# (terrain,x#,y#,z# ) - высота пересчитанной координаты;
TerrainZ# (terrain,x#,y#,z# ) - z-координата в пределах местности;

где x#,y#,z# - абсолютные координаты.

Данная возможность полезна, если нам, например, требуется плавно огибать местность с учетом ее возвышений.

...
; смотрим координаты камеры
x#=EntityX(camera)
y#=EntityY(camera)
z#=EntityZ(camera)

; пересчитываем y-координату камеры в новом месте
; получаем ее с учетом реальной высоты
; данной точки
terra_y#=TerrainY(terrain,x#,y#,z#)+5

; позиционируем камеру -
; она установится на высоте текущей точки
PositionEntity camera,x#,terra_y#,z#

; показать
RenderWorld

; изменить координаты камеры...
...

Задание. Напишите программу, которая будет перемещать камеру по пересеченной местности, и по нажатию на определенные клавиши будет изменять высоту текущей точки местности.


(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои книги (учебные курсы) "Технологии Delphi / C++ / C#".
http://shop.piter.com/publish/authors/17681/191180213/

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией. Именно это мои книги и дают.
В учебных курсах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Delphi 2005/2006/2007 и Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное