// в данной структуре вместо целого значения цвета используется вектор с реальными координатами
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 – привязка камеры к поверхности ландшафта (нельзя будет опуститься под поверхность).