ПрограммированиеFAQГрафика

Как найти высоту точки по карте высот?

Если задана дискретная карта высот, то можно найти высоту в любой точке {ax, az}, не находящейся в узле.

Делается это следующим образом:

 x0, z0 : integer;
 x1, z1 : integer;
 dx, dz : float

Получаем узловые точки (clamp для того, чтобы не выйти за пределы карты)

 x0 = clamp( trunc(ax), 0, MAP_SIZE );
 z0 = clamp( trunc(az), 0, MAP_SIZE );
 x1 = clamp( x0+1, 0, MAP_SIZE );
 z1 = clamp( z0+1, 0, MAP_SIZE );

Получаем смещение

 dx = ax - x0;
 dz = az - z0

Теперь рассмотри два случая:
1. Когда dz > dx
dz_dx | Как найти высоту точки по карте высот?

 return mesh[z1, x0].y + (1.0 - dz) * (mesh[z0, x0].y - mesh[z1, x0].y) + dx * (mesh[z1, x1].y - mesh[z1, x0].y)

2. Когда dx > dz
dx_dz | Как найти высоту точки по карте высот?

 return  mesh[z0, x1].y + dz * (mesh[z1, x1].y - mesh[z0, x1].y) + (1.0 - dx) * (mesh[z0, x0].y - mesh[z0, x1].y);

Удачи!

18 ноября 2008 (Обновление: 9 фев 2011)

Комментарии [12]

#1
20:37, 23 июня 2009

а, mesh[z0, x0], как я понимаю, - координаты точки в сетке?

#2
22:18, 23 июня 2009

Да. Можно так же использовать heightmap[z0, x0]

#3
22:21, 23 июня 2009

Карта высот - вариант интересный. Сколько же их нужно, чтобы сделать полноценный мир?))) Вот то-то и оно, что до фига... Как вообще реализуется перемещение персонажа по ландшафту? То есть, каким будет унифицированное решение и для Morrowind ("одноэтажный мир") и для "многоуровневого" квейка?)))

#4
14:52, 19 июля 2009

Обычное решение - проверять другим методом колижен - обычным пополигональным. У будет всеравно что там.

#5
16:19, 19 июля 2009

Мне так кажется, или эта статья была очень давно?

#6
18:59, 7 авг 2009

18 ноября 2008

#7
23:12, 7 авг 2009

X512
не кажется http://www.gamedev.ru/articles/read.shtml?id=30110

#8
12:23, 17 авг 2009

а что если dz == dx ?? :) Нужно хоть пометку сделать, а то люди, которые заюзают пример, сделают обработку только двух вариантов.

#9
13:37, 17 авг 2009

Durane
> а что если dz == dx ??
Тогда не важно будет :)

if (dx < dz)
{
}
else
{
 ПОПАДЕМ СЮДА!
}
#10
17:09, 12 янв 2010

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

Прошло более 1 года
#11
17:22, 21 мар 2011

этот метод быстрее должно быть чем проверка пересечения луча и треугольника ?

#12
19:47, 21 мар 2011

> Как найти высоту точки по карте высот?
использовать билинейную интерполяцию. Собственно она эти задачи и решает.
А вы какие-то велосипеды изобретаете.

UPD: cibergod, почетную лопату тебе

ПрограммированиеFAQГрафика

Тема в архиве.