Каждая вершина помимо своей высоты расположения (y), будет иметь еще и позицию по x,z. При использовании карты высот также создается двумерный массив, но обычно каждый элемент массива это лишь параметр указывающий высоту, т.к. позиция этой вершины определена ее порядковым номером в массиве. Так полигоны, которые создаются на основе этих вершин, расположены по x,z в строгом порядке и не могут располагаться друг над другом. В моем же примере вполне возможно, что полигоны ландшафта могут находиться друг над другом (к примеру: гора нависающая над какой-то частью ландшафта), поэтому задается полное расположение вершины в трехмерном пространстве.
После указываются начальные координаты каждой вершины. Высота каждой из них равна 0 (Y=0).
x,y - порядковый номер вершины
obj.ext[n].hVer - это позиция экстремума, n - номер экстремума(т.к. их может быть много)
Высота экстремума:
Height = obj.ext[n].hVer.y
Полученное расстояние надо сравнить с "радиусом распространения" экстремума, если расстояние от экстремума до точки будет меньше, то данная точка должна будет подняться на определенную высоту в зависимости от близости расположения к экстремуму. Гора строится с помощью использования графика косинуса (cos). Наивысшая точка (экстремум) достигается умножением (Cos(0)+1) на высоту расположения экстремума, а точка самого начала (подножия горы) умножением на (Cos(pi)+1), т.е.
(Cos(Rad)+1)*Height,
где Rad - угол, а Height - высота расположения экстремума. Если расстояние от экстремума до вершины равно 0, то Rad так же равен 0, если же оно равно Radius("радиусу распространения") данного экстремума, то Rad = pi. Из этого следует, что
Rad = Length/Radius*pi.
Общая формула высоты, на которую надо поднять точку:
dLen = (cos(pi*Length/Radius)+1)*Height.
Получившееся значение прибавляем к позиции точки по Y.
Представьте, что у вас есть гора и вы хотите, чтобы она нависала над какой-то частью ландшафта. Для этого надо все точки, которые входят в образование горы сдвинуть в сторону "нависания", при этом, чем выше находится точка тем сильнее она должна быть сдвинута, и наоборот чем ближе она находится к 0-му уровню ландшафта тем меньше она сдвигается. Все это делается следующим простым способом. К позициям точки по X,Z прибавляем значение сдвига dx, dz, которые находятся путем умножения высоты поднятия точки на коэффициент сдвига:
dx = dLen*dX, dz = dLen*dZ,
dX, dZ - коэффициенты сдвига, задающиеся вместе с экстремумами(obj.ext[n].dx, obj.ext[n].dz).
Ниже приводится часть кода, которая реализует все это.
И самое последнее, что надо сделать, это переместить ландшафт на расстояние, которое задается до его создания (obj.Pos). Для этого сдвигаются все точки ландшафта.