C++ 在OpenGL中在地形(使用heightmap制作)上行走对象
要在地形上行走一个对象,当前我将固定相机和对象,并根据按下的键盘按钮移动地形(使用GLTRANSTEF)。我可以很容易地沿着x轴和z轴移动,但是当我沿着y轴移动时,我遇到了很多麻烦。以下是代码的基本部分: 我创建了一个名为Terrain的类,它使用bmp文件获取不同点的高度。基本守则是: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
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);