为了正确地将高度图图像的每个像素映射到地形,我们最终会得到一个宽度和长度都比高度图的实际宽度和长度少 1 个单位的地形。例如,如果我们有一个只有 2 个像素宽的图像,每个像素将映射到四边形的每个顶点。我们有 2 个像素,但只有 1 个地形单位。
我试图通过缩放地形以填充地形末端的空四边形来“解决”这个问题。但是,当我尝试获取某个 (x,z) 点的地形高度时,这是有问题的。问题并不完全是您将看到的缩放。
首先,让我们看一下有效的代码。缩放不考虑丢失的四边形的那个。我有一个 1024x1024 高度图,它将创建一个具有 1023x1023 四边形的地形(我实际上使用的是三角形,但用四边形很容易解释)而无需任何缩放。
现在让我们通过将适当的参数传递给以下函数来将地形缩放到类似 2000x2000 的大小:
void Terrain::ScaleDimension(float dimWidth, float dimLength) {
if(dimWidth <= 0.0f || dimLength <= 0.0f) return;
stepWidth = dimWidth / width; // 1.953125 = 2000 / 1024
stepLength = dimLength / length; // 1.953125 = 2000 / 1024
}
当我绘制地形时,我使用stepWidth
和stepLength
适当地缩放地形。地形将被缩放,但只会使用 1023 个四边形,总是 1023,不再有(这很好)。现在假设我正在移动我的游戏角色,我需要获取当前玩家位置的地形高度。我有一个函数,它将获取玩家位置的x
和z
坐标并返回该点的高度。但是由于地形尺寸是缩放的,我不能只使用x
andz
传递给函数,我需要计算正确的,如下所示:
x = x / stepWidth;
z = z / stepLength;
之后,我只需要找到新的 4 个相邻顶点,x
并对z
所有顶点高度执行双线性插值,以计算玩家位置的正确高度。
这一切都很好。正确绘制了地形,并正确计算了所有高度。我的问题是当我试图绕过这个问题开头解释的“限制”时。
为了解决这个问题,我将 scale 函数更改为:
void Terrain::ScaleDimension(float dimWidth, float dimLength) {
if(dimWidth <= 0.0f || dimLength <= 0.0f) return;
stepWidth = dimWidth / (width - 1.0f);
stepLength = dimLength / (length - 1.0f);
}
假设我的地形大小(我传递给上面缩放函数的值)与高度图的大小完全相同,即 1024x1204。这将为我提供一个步骤,1.000977517106549364613880742913
使 1023 四边形完全适合 0 到 1024(地形的大小)。到目前为止一切顺利,地形完全按照我的预期绘制。
真正的问题是计算高度。我已经尝试了很多事情,但我无法弄清楚计算正确的方程式x
并z
用于返回高度的函数,给定上面的新步计算。像我以前那样潜水x
和z
步长根本不会削减它。现在计算的步骤略有不同,不像以前那么简单。