Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / 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

Комментарии:
XJeazУдалёнwww23 июня 200920:37#1
а, mesh[z0, x0], как я понимаю, - координаты точки в сетке?
SergioУдалёнwww23 июня 200922:18#2
Да. Можно так же использовать heightmap[z0, x0]
XJeazУдалёнwww23 июня 200922:21#3
Карта высот - вариант интересный. Сколько же их нужно, чтобы сделать полноценный мир?))) Вот то-то и оно, что до фига... Как вообще реализуется перемещение персонажа по ландшафту? То есть, каким будет унифицированное решение и для Morrowind ("одноэтажный мир") и для "многоуровневого" квейка?)))
The AndreypПостоялецwww19 июля 200914:52#4
Обычное решение - проверять другим методом колижен - обычным пополигональным. У будет всеравно что там.
X512Постоялецwww19 июля 200916:19#5
Мне так кажется, или эта статья была очень давно?
eclipsevlПостоялецwww7 авг. 200918:59#6
18 ноября 2008
ArochПостоялецwww7 авг. 200923:12#7
DuraneПостоялецwww17 авг. 200912:23#8
а что если dz == dx ?? :) Нужно хоть пометку сделать, а то люди, которые заюзают пример, сделают обработку только двух вариантов.
SergioУдалёнwww17 авг. 200913:37#9
Durane
> а что если dz == dx ??
Тогда не важно будет :)
if (dx < dz)
{
}
else
{
 ПОПАДЕМ СЮДА!
}
cibergodПостоялецwww12 янв. 201017:09#10
Всю жизнь бегал по полигонам триангуляцией для вычисления смещения камеры а теперь надо попробовать воспользоваться этим алгоритмом может будет лучше )
BashkaПостоялецwww21 мар. 201117:22#11
этот метод быстрее должно быть чем проверка пересечения луча и треугольника ?
@!!exПостоялецwww21 мар. 201119:47#12
> Как найти высоту точки по карте высот?
использовать билинейную интерполяцию. Собственно она эти задачи и решает.
А вы какие-то велосипеды изобретаете.

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

/ Форум / Программирование игр / Графика

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

2001—2017 © GameDev.ru — Разработка игр