Программа «Редактор ландшафта»

   

// в данной структуре вместо целого значения цвета используется вектор с реальными координатами

class Light

{

   public Vector Ambient;

   public Vector Diffuse;

   public Vector Mirror;

 

   public Light() { }

   public Light(Vector Ambient, Vector Diffuse, Vector Mirror)

   {

       this.Ambient = Ambient;

       this.Diffuse = Diffuse;

       this.Mirror = Mirror;

   }

}

 

class DirLight: Light

{

   public Vector Dir;

 

   public DirLight() { }

   public DirLight(Vector Ambient, Vector Diffuse, Vector Mirror, Vector Dir)

      : base(Ambient, Diffuse, Mirror)

   {

       this.Dir = Dir;

   }

}

 

class PointLight: Light

{

   public Vector Point;

   public double c1, c2, c3;

 

   public PointLight(Vector Ambient, Vector Diffuse, Vector Mirror, double c1, double c2, double c3, Vector Point)

      : base(Ambient, Diffuse, Mirror)

   {

       this.Point = Point;

       this.c1 = c1;

       this.c2 = c2;

       this.c3 = c3;

   }

}

 

class Material

{

   public Vector Ambient;

   public Vector Diffuse;       

   public Vector Mirror;

 

   public Material(Vector Ambient, Vector Diffuse, Vector Mirror)

   {

       this.Ambient = Ambient;

       this.Diffuse = Diffuse;

       this.Mirror = Mirror;

   }

}

 

 

class PerlinNoise

{

   int TableSize;

   int TableMask;

 

struct vec2

{

    public double x, y;

    public vec2(double x, double y) { this.x = x; this.y = y; }

};

 

vec2[] VectorTable;

byte[] lut;

 

   public PerlinNoise(int TableSize)

 

   void setup()

 

// вычисляется значение шумовой функции (в данной программе высота) с коэффициентом scale (чем больше scale, тем более изломанная карта) в координате x y

   public double Generate(double x, double y, double scale)

 

   public double Generate(int x, int y, double scale)

}

 

class Landscape

{

   GenMethod LandGenMethod;

   Convolution[] Convs;

   bool Smoothing;

   bool Valley;

   bool Island;

 

   public double[,] Heightmap;

   int[,] Lightmap;

   int[,] Colormap;

       

   public int SizeX, SizeY;

   int LSizeX, LSizeY;

   int CSizeX, CSizeY;

 

   Vector[,] Points;

   int[] Indexes;

   Vector[] FaceNormals;

   Vector[,] VertexNormals;

 

   Vector Pos;

   Vector Dimen;

 

   public Material Ground;

 

     public Landscape() { }

 

   // генерирует карту высот с размером SizeX, SizeY, по методу LandGenMethod c коэффициентами Convs, со сглаживанием или нет (Smoothing) с долинизацией (Valley)

   public void GenerateHeightmap(int SizeX, int SizeY, GenMethod LandGenMethod, Convolution[] Convs, bool Smoothing, bool Valley, bool Island)

 

   // строить трехмерную модель ландшафта с размерами Dimen.X Dimen.Y Dimen.Z

   // Также просчитываются нормали к граням FaceNormals и к вершинам VertexNormals

   public void BuildMesh(Vector Dimen)

 

   // Цвет данной точки ландшафта с координатами Pos нормальную Normal добавляется к результирующему Color

   public void AddColor(Vector Pos, Vector Normal, Light Source, ref int Color)

 

   // построение карты освещенности с учетом Sources источников света. Размер карты SizeX*Size SizeY*Size

   public void BuildLightmap(Light[] Sources, int Size)

 

   // построение карты теней и смешение ее с картой освещенности

   public void BuildShadowmap(Light[] Lights, int Size)

 

   // построение "цветовой" карты (или текстуры) на основе массива Colors

   public void GenerateColormap(Color[] Colors, int Size)

 

   // сохранение карты высот в файл BMP

   public void SaveHeightmap(string FileName, out Bitmap Result)

 

   // сохранение карты освещенности в файл BMP

   public void SaveLightmap(string FileName, out Bitmap Result)

 

   // сохранение текстуры в файл BMP

   public void SaveColormap(string FileName, out Bitmap Result)

}

 

Пользовательский интерфейс

 

Редактор ландшафта

 

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

 

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

Поле размер – установка ширины, длины карты высот, а высота нужна для дальнейшего построения карты освещенности (регулирование пропорций ландшафта)

Поле материал – установка отражающей способности материала ландшафта для фонового и диффузного отражений соответственно (белый цвет – отражение всех цветов)

Шкала цветов используется при построении текстуры ландшафта (каждому значению высоты соответствует цвет из этой шкалы цветов)

Далее можно выбирать алгоритм генерации ландшафта: с помощью шума Перлина или простого холмового алгоритма

Флажок «Остров» используется для генерации таких типов ландшафтов, на границе которых высота равна нулю (для плавного спуска в воду)

Флажок «Долина» используется для долинизации ландшафта

 

В данной программе можно создавать карту освещенности с различно настроенными источниками света в количестве не более 5.

Для каждого источника света также можно настривать цвет фонового освещения, диффузного освещения, вектор направления (или позицию с коэффициентами угасания c1 c2 c3 для точечных источников)

 

 

Работа программы

Создание карт

Создать карту высот можно двумя способами:

· загрузить уже имеющееся изображение в формате BMP (поддерживается работа только с 24-битным цветом).

· сгенерировать новую карту

 

При создании карты высот, автоматически создаются карта освещенности и текстура.

Сохранение карт

Сохранение производится автоматически при нажатии на кнопку «Генерировать». При сохранении создаются 3 файла:

· карта высот *.bmp

· карта освещенности *.bmp

· текстура *.bmp

 

Программа LandViewer

 

 

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

 

W, A, S, D – навигация по пространству

[ ] – увеличение/уменьшение уровня моря.

z, x, c – включение/отключение соответственно текстуры, карты освещенности и карты деталей.

v – привязка камеры к поверхности ландшафта (нельзя будет опуститься под поверхность).

 

 

    

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: