Создание трехмерного ландшафта

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

Например, трехмерная поверхность земли может состоять из нескольких сотен и тысяч граней.
трехмерная поверхность

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

фрактал плазма

А уже по этим изображения можно создать трехмерную проекцию поверхности. Черный цвет определяет самую высокую точку. Белый – самую низкую, или наоборот. Данное изображение состоит из оттенков серого и поэтому все высоты находятся в промежутке (0;255)

Наша цель написать программу, которая генерировала бы такие изображения и по ним создавать трехмерные поверхности в формате VRML. Мы будем использовать этот формат трехмерных файлов, так как его очень легко использовать в программировании.

Программировать будем в системе Lazarus – она бесплатная и основана на языке Паскаль, это позволяет очень легко ее освоить и так же для Lazarus существует трехмерный игровой движок на VRML, что позволяет напрямую работать с этими моделями в Lazarus.

Первое что должна делать эта программа – это генерировать изображения плазмы. Алгоритм состоит в том, что мы берем квадрат и случайным образом генерируем высоты в углах. Высота в данном случае это цвет пикселя в углу квадрата. Дале будем вычислят значение высот на сторонах, эти высоты будут равны полу сумме высот на концах стороны. Значение высоты в центре будет равно среднеарифметическому значению в углах квадрата и плюс некоторое смещение, которое будет зависеть от размера квадрата.

Теперь приступим к созданию самой программы. Создадим проект в Lazarus и разместим на нем панель, на которой и будем строить фрактал плазма. На рисунке панель имеет синий цвет. Дизайн программы можно выбирать по желанию, большой роли в программе он не играет.

дизайн программы

И создадим кнопку для случайной генерации. И добавим поле Edit , в котором мы будем задавать размер стороны квадрата.

Для генерации будем использовать рекурсивную функцию, которая будет выполнять сама себя, уменьшая квадрат до минимума.

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

Вот что получилось:

Копка очистить нужна для очистки канвы для генерации других поверхностей. Код очень простой:

И теперь необходимо сгенерировать трехмерную модель. Модель будем создавать в формате VRML, так как это просто текстовый файл. Этот файл мы будем записывать в memo1.

Для того чтобы повысить скорость генерации моделей Memo1 необходимо скрыть

Кодом

Вот функция генерации моделей: