Как рассчитать наклон точки на данных о местности (например, цифровая матрица высот)
Я хочу реализовать трехмерную гоночную игру, и мне нужно приблизить величину и направление наклона любой произвольной точки на местности.
Формат данных местности:
- высота [ ][ ]: двумерный массив поплавков (представляющий высоту в метрах)
- единица измерения: горизонтальная единица расстояния между (i, j) - (i, j+1) и между (i, j) - (i+1, j) в метрах
Пример:
3|1311
2|2542 <-- 2D array of heights in meters
1|2231 (unit distance between two cell is, say, 1 meters)
0|1121 (so the highest point of the terrain (x = 1.5 meters, y = 2.5 meters)
---- is 5 meters high)
0123
Каково значение и направление уклона в точке, скажем, (х = 1,75 метра, у = 2,25 метра)?
Каким будет ваш алгоритм интерполяции?
1 ответ
Конечно, вы могли бы линейно интерполировать вдоль оси x и y, т.е. сначала интерполировать значение y для координат x, которые ниже и выше вашего фактического значения x в два раза - один раз для координаты y ниже, чем ваше фактическое значение y, и один раз для значения у, превышающего фактическое значение у. Это дает вам два значения y, между которыми вы можете линейно интерполировать, чтобы получить высоту.
Чтобы найти наклон, вам нужно найти нормаль в этой точке. Чтобы найти нормаль, вы можете выполнить интерполяцию таким же образом. Для одного из исправлений (определяется четырьмя точками A:(x1,y1), B:(x2, y1), C:(x2,y2) и D:(x1,y2), x1 Линейно интерполировать нормали так же, как для высоты. Я не знаю, в каком формате вы хотите наклон, но если вы хотите, чтобы вектор указывал в направлении наклона, он был бы рассчитан как S = N - Up, где Up - просто вектор вверх (в этом примере (0,0,1), так как вы используете Z как вверх. Другой подход заключается в том, чтобы разбить квадраты на треугольники, например, ABD и BCD. Тогда нормаль для всего треугольника будет AB x AD и BC x BD соответственно. В этом случае, посмотрите на http://www.cc.gatech.edu/classes/AY2007/cs3451_spring/lininter.pdf например, как интерполировать высоту в треугольнике. Этот подход дает вам гладкие треугольники, но есть заметные различия в наклоне между соседними треугольниками.