Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何正确获取缩放地形中点(x,z)处的地形高度_Math_Opengl_Height_Terrain_Heightmap - Fatal编程技术网

Math 如何正确获取缩放地形中点(x,z)处的地形高度

Math 如何正确获取缩放地形中点(x,z)处的地形高度,math,opengl,height,terrain,heightmap,Math,Opengl,Height,Terrain,Heightmap,为了正确地将heightmap图像的每个像素映射到地形,我们最终将得到一个宽度和长度均小于heightmap实际宽度和长度1个单位的地形。例如,如果我们有一个只有2像素宽的图像,每个像素将映射到四边形的每个顶点。我们有2个像素,但只有1个单位的地形 我试图通过缩放地形以填充地形末端的空四边形来“修复”这个问题。但是,当我尝试获取某个(x,z)点的地形高度时,这是有问题的。问题不完全是您将看到的缩放 首先,让我们看看有效的代码。缩放时不考虑缺少的四元体。我有一个1024x1024高度图,它可以创建

为了正确地将heightmap图像的每个像素映射到地形,我们最终将得到一个宽度和长度均小于heightmap实际宽度和长度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
}
之后,我只需要找到新的
x
z
的4个相邻顶点,并对所有顶点高度执行双线性插值,以计算玩家位置上的正确高度

这一切都很好。正确绘制地形并正确计算所有高度。我的问题是当我试图绕过此问题开头解释的“限制”时

为了解决这个问题,我将比例函数改为:

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);
}
void地形::缩放尺寸(浮动dimWidth、浮动dimLength){

如果(dimWidth如果要从
0..1023
放大到
0..1999
则需要沿每个位置采样以获得正确的值

Given:  old        new
       0,0       == 0,0
       0,1023    == 0,1999
       1023,0    == 1999,0
       1023,1023 == 1999,1999
换句话说,四个角保持不变

现在,你需要计算任意给定点的高度,你可以这样称呼它:

x = x / stepWidth;
z = z / stepLength;
float height = convert(1500,1450,1024,2000);

float convert(int newx, int newy, int origScale, int newScale) {
    float factor = ((float)(origScale)) / (float)(newScale);
    float oldx = newx * factor;
    float oldy = newy * factor;

    int oldxlo = floorInt(oldx); // oldx == 3.4, oldxlo = 3
    int oldxhi = ceilInt(oldx); // oldx == 3.4, oldxhi = 34
    int oldylo = floorInt(oldy); // oldy == 3.4, oldylo = 3
    int oldyhi = ceilInt(oldy); // oldy == 3.4, oldyhi = 34

    float topLeftHeight = getHeight(oldxlo,oldylo);
    float topRightHeight = getHeight(oldxhi,oldylo);
    float botLeftHeight = getHeight(oldxlo,oldyhi);
    float botRightHeight = getHeight(oldxhi,oldyhi);

    // now you have the heights of the four corners of the old grid
    // that surround the new grid. You can use a form of interpolation on this grid,
    // I'm sure you can find one somewhere.

    Point3D topLeft(oldxlo,oldylo,topLeftHeight);
    Point3D topRight(oldxhi,oldylo,topRightHeight);
    Point3D botLeft(oldxlo,oldyhi,botLeftHeight);
    Point3D botRight(oldxhi,oldyhi,botRightHeight);


    // or something
    return bilinearInterpolate(topLeft,topRight,botLeft,botRight,newx,newy);

}

方法太简单了。有建筑物和物体的复杂3D地形呢?我用glReadPixels读取深度缓冲区,并用一些简单的数学计算场景中任何地方的地形高度。

我想你不明白我的问题……我已经知道了所有这些。问题在于“因子”计算。但这与2000比例尺无关,这只是一个例子。@Nazgulled,那么你的问题是什么?似乎你在计算比例尺地形上的高度时遇到了困难。不,我不是,这不是问题。请再读一遍问题,这里已经解释过了。问题不是比例尺地形p呃,我可以上下缩放地形,并正确计算任何点的高度(如问题中所述).问题是当我改变缩放方式时。好的,问题是什么?你有高度图吗?你可以画它,对吗?你可以将它缩放到任意数量的点,对吗?但是你不知道如何缩放高度?不要缩放它!确定新点的旧坐标,并检查它在旧坐标中的高度。因此,取而代之的是sc所有高度,只需回到“原始”缩放。不要试图将高度贴图的采样视为像素,而只是采样点。在任意方向上都有n×m地形采样点,这就是您正在绘制的-或者您可以将采样点视为每个地形单元的平均值,顶点高度实际上是它们共享的单元的平均值(这样,您的heightmap维度正好是地形单元的数量)。我个人更喜欢后一种方法,并且我不会将地形绘制为四边形,而是在每个“单元”的采样位置绘制一个中间顶点,并在其周围绘制一个三角形扇形到平均顶点。