Как рассчитать наклон точки на данных о местности (например, цифровая матрица высот) - PullRequest
2 голосов
/ 14 января 2010

Я хочу реализовать трехмерную гоночную игру, и мне нужно приблизить величину и направление наклона любой произвольной точки на местности.

Формат данных местности:
- высота [] []: двумерный массив чисел с плавающей точкой (представляющий высоту в метрах)
- единица измерения: горизонтальная единица расстояния между (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

Каково значение и направление уклона в точке, скажем, (x = 1,75 метра, y = 2,25 метра)?

Каким будет ваш алгоритм интерполяции?

1 Ответ

3 голосов
/ 14 января 2010

Конечно, вы могли бы линейно интерполировать вдоль оси x и y, т.е. сначала интерполировать значение y для координат x, которые ниже и выше вашего фактического значения x в два раза - один раз для координаты y ниже, чем ваша фактическая значение y и один раз для значения 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, например, как интерполировать высоту в треугольнике. Этот подход дает вам гладкие треугольники, но есть заметные различия в наклоне между соседними треугольниками.

...