C++ 在OpenGL中在地形(使用heightmap制作)上行走对象

C++ 在OpenGL中在地形(使用heightmap制作)上行走对象,c++,opengl,C++,Opengl,要在地形上行走一个对象,当前我将固定相机和对象,并根据按下的键盘按钮移动地形(使用GLTRANSTEF)。我可以很容易地沿着x轴和z轴移动,但是当我沿着y轴移动时,我遇到了很多麻烦。以下是代码的基本部分: 我创建了一个名为Terrain的类,它使用bmp文件获取不同点的高度。基本守则是: float Terrain::getHeight(int x, int z) { return hs[z][x]; } Terrain* loadTerrain(const char* filenam

要在地形上行走一个对象,当前我将固定相机和对象,并根据按下的键盘按钮移动地形(使用GLTRANSTEF)。我可以很容易地沿着x轴和z轴移动,但是当我沿着y轴移动时,我遇到了很多麻烦。以下是代码的基本部分:

我创建了一个名为Terrain的类,它使用bmp文件获取不同点的高度。基本守则是:

float Terrain::getHeight(int x, int z) {
    return hs[z][x];
}

Terrain* loadTerrain(const char* filename, float height) {
    Image* image = loadBMP(filename);
    Terrain* t = new Terrain(image->width, image->height);
    for (int y = 0; y < image->height; y++) {
        for (int x = 0; x < image->width; x++) {
            unsigned char color = (unsigned char) image->pixels[3
                    * (y * image->width + x)];
            float h = height * ((color / 255.0f) - 0.5f);
            t->setHeight(x, y, h);

        }
    }

    delete image;
    t->computeNormals();
    return t;
}

但是平移仍然不能根据高度进行,y平移看起来也不是连续的(因为我正在转换整型值和浮点值)。有谁能修改这个代码,或者建议一些其他的方法,让我可以在地形上正确地行走一个物体吗?谢谢。

地形漫游通常涉及光线投射。谷歌搜索。这里我们不修复代码;)我能在地形上漫游,问题是要在某一点上获得高度。使用光线投射意味着完全更改我的代码:(无论如何,谢谢可能是的,但是使用光线投射更容易设置。您是否查看了Terrain::hs数组中实际存储的值,以确保它们不完全相同?另外,在您尝试进行y转换的最后一个框中,您在xxx和zzz值中都使用了“xx”。这是您想要的吗?^Oops。我已经看到了修正了代码的这一部分。不,数组的所有元素都不一样。但是我仍然有一个问题,在离散级别加载高度。。。
void drawTerrain(float xx, float yy, float zz, float aangle) {
    float yyy;
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, 0.0f);
    glRotatef(-aangle, 0.0f, 1.0f, 0.0f);
    glTranslatef(xx, yy, zz);

    GLfloat ambientColor[] = { 0.4f, 0.4f, 0.4f, 1.0f };
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);

    GLfloat lightColor0[] = { 0.6f, 0.6f, 0.6f, 1.0f };
    GLfloat lightPos0[] = { -0.5f, 0.8f, 0.1f, 0.0f };
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _textureId1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    float scale = 50.0f / max(_terrain->width() - 1, _terrain->length() - 1);
    glScalef(scale, scale, scale);
    glTranslatef(-(float) (_terrain->width() - 1) / 2, 0.0f,
            -(float) (_terrain->length() - 1) / 2);

    glColor3f(1.0f, 1.0f, 1.0f);
    for (int z = 0; z < _terrain->length() - 1; z++) {
        //Makes OpenGL draw a triangle at every three consecutive vertices
        glBegin(GL_TRIANGLE_STRIP);
        for (int x = 0; x < _terrain->width(); x += 2) {
            /*if (x == 0 && z == 0)
             glTexCoord2f(0.0f, 0.0f);
             if (x == _terrain->width() - 1 && z == 0)
             glTexCoord2f(1.0f, 0.0f);
             if (x == 0 && z == _terrain->length() - 1)
             glTexCoord2f(0.0f, 1.0f);
             if (x == _terrain->width() - 1 && z == _terrain->length() - 1)
             glTexCoord2f(1.0f, 1.0f);*/
            Vec3f normal = _terrain->getNormal(x, z);
            glNormal3f(normal[0], normal[1], normal[2]);
            glTexCoord2f((float) x / _terrain->width(),
                    (float) z / _terrain->length());
            glVertex3f(x, _terrain->getHeight(x, z), z);
            normal = _terrain->getNormal(x, z + 1);
            glNormal3f(normal[0], normal[1], normal[2]);
            glTexCoord2f((float) x / _terrain->width(),
                    (float) (z + 1) / _terrain->length());
            glVertex3f(x, _terrain->getHeight(x, z + 1), z + 1);
            glNormal3f(normal[0], normal[1], normal[2]);
            glTexCoord2f((float) (x + 1) / _terrain->width(),
                    (float) z / _terrain->length());
            glVertex3f(x + 1, _terrain->getHeight(x + 1, z), z);
            glNormal3f(normal[0], normal[1], normal[2]);
            glTexCoord2f((float) (x + 1) / _terrain->width(),
                    (float) (z + 1) / _terrain->length());
            glVertex3f(x + 1, _terrain->getHeight(x + 1, z + 1), z + 1);

        }
        //_y = (float) _terrain->getHeight((int) (_x * max(_terrain->width() - 1, _terrain->length() - 1) / 50.0f), (int) (_z * max(_terrain->width() - 1, _terrain->length() - 1) / 50.0f));
        glEnd();
    }
float xxx,yyy,zzz;
xxx = (float) (_terrain->width() - 1) / (2 * scale);
xxx -= xx / scale;
zzz = (float) (_terrain->length() - 1) / (2 * scale);
zzz -= zz / scale;
yyy = scale * _terrain->getHeight(xxx,zzz);
glTranslatef(0.0f,yyy,0.0f);