terrain - 如何计算地形数据上的点的坡度(例如数字高程矩阵)

标签 terrain racing linear-interpolation

我想实现一个 3D 赛车游戏,我需要近似地形上任意点的坡度大小和方向。

地形数据格式:
- heights[ ][ ]: 二维 float 组(表示高度,以米为单位)
-单位:(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 米)处的坡度值和方向是多少?

你的插值算法是什么?

最佳答案

您当然可以沿 x 轴和 y 轴线性插值,即首先为低于和高于实际 x 值的 x 坐标插入 y 值两次 - 一次为低于实际 x 值的 y 坐标插值y 值和 y 值比实际 y 值高一倍。这将为您提供两个 y 值,您可以在它们之间进行线性插值以获得高度。

为了找到斜率,您需要找到该点的法线。要找到法线,您可以以相同的方式进行插值。给定一个补丁(由四个点 A:(x1,y1)、B:(x2,y1)、C:(x2,y2) 和 D:(x1,y2) 确定,x1 < x2、y1 < y2 且每个点还包括高度)您可以说其中一个点(例如 A)的法线由向量 AB 和 AD 的叉积确定。 B 处的法线为 BC x BA,同理。

以与高度相同的方式对法线进行线性插值。我不知道你想要什么格式的斜率,但如果你想要一个指向斜率方向的向量,那么可以通过 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例如如何插入三角形的高度。这种方法可以为您提供平滑的三角形,但相邻三角形之间的斜率存在显着差异。

关于terrain - 如何计算地形数据上的点的坡度(例如数字高程矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060813/

相关文章:

javascript - 马赛克 Canvas 2d 游戏中的地形联合

c++ - 为什么 std::lerp 不适用于任何已实现所需操作的类型?

Matlab 反向二维插值 interp2

c++ - 将 float 的高度图数组导出为 16 位原始格式

python - 生成混沌噪声较少的地形

java - 游戏中表达道路交通状况的数据结构

delphi - 在计时应用程序中对赛车手进行排序

actionscript-3 - Flash赛车游戏物理

r - 在 r 中的向量边界处填充 NA

delphi - Canvas /位图滚动问题