C++ heightmap地形碰撞OpenGL

C++ heightmap地形碰撞OpenGL,c++,collision,terrain,heightmap,C++,Collision,Terrain,Heightmap,因此,我根据高度贴图渲染了一个地形。这是基于我遵循的本教程- 现在,我想让我的相机能够在地形上“行走”,但我不确定如何真正做到这一点。我检查了很多其他的例子,得到了一些关于重心坐标的提示。但我不确定如何正确实施它 float Terrain::getY(int x, int z) { //return } void Terrain::createTerrain() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Setup he

因此,我根据高度贴图渲染了一个地形。这是基于我遵循的本教程-

现在,我想让我的相机能够在地形上“行走”,但我不确定如何真正做到这一点。我检查了很多其他的例子,得到了一些关于重心坐标的提示。但我不确定如何正确实施它

float Terrain::getY(int x, int z)
{

    //return
}

void Terrain::createTerrain()
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    // Setup heightmap

    glGenVertexArrays(1, &uiVAOHeightmap); // Create one VAO
    glGenBuffers(1, &uiVBOHeightmapData); // One VBO for data
    glGenBuffers(1, &uiVBOIndices); // And finally one VBO for indices

    glBindVertexArray(uiVAOHeightmap);
    glBindBuffer(GL_ARRAY_BUFFER, uiVBOHeightmapData);

    float fHeights[HM_SIZE_X*HM_SIZE_Y] =
    {
        10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f,
        5.0f, 5.0f,5.0f, 10.0f, 10.0f, 10.0f,
        5.0f, 5.0f, 5.0f, 10.0f, 10.0f, 10.0f,
        5.0f, 5.0f, 10.0f, 10.0f, 10.0f, 10.0f,
        10.0f, 10.0f, 10.0f, 10.0f, 10.0f, 10.0f,
        10.0f, 5.0f, 5.0f, 5.0f, 5.0f, 10.0f,
    };

    float fSizeX = 100.0f, fSizeZ = 100.0f;

    for (int i = 0; i<HM_SIZE_X*HM_SIZE_Y;i++)
    {
        for (int j = 0; j < HM_SIZE_X*HM_SIZE_Y; j++)
        {
            float column = float(i%HM_SIZE_X), row = float(i / HM_SIZE_X);
            vHeightmapData[i] = glm::vec3(
                -fSizeX / 2 + fSizeX*column / float(HM_SIZE_X - 1), // X Coordinate
                fHeights[i],                                    // Y Coordinate (it's height)
                -fSizeZ / 2 + fSizeZ*row / float(HM_SIZE_Y - 1) // Z Coordinate
            );
        }
    }

    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3)*HM_SIZE_X*HM_SIZE_Y, vHeightmapData, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glGenBuffers(1, &uiVBOIndices);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, uiVBOIndices);
    int iIndices[] =
    {
        0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 36,
        6, 12, 7, 13, 8, 14, 9, 15, 10, 16, 11, 17, 36,
        12, 18, 13, 19, 14, 20, 15, 21, 16, 22, 17, 23, 36,
        18, 24, 19, 25, 20, 26, 21, 27, 22, 28, 23, 29, 36,
        24, 30, 25, 31, 26, 32, 27, 33, 28, 34, 29, 35
    };
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(iIndices), iIndices, GL_STATIC_DRAW);
    glEnable(GL_PRIMITIVE_RESTART);
    glPrimitiveRestartIndex(HM_SIZE_X*HM_SIZE_Y);
}
float地形::getY(intx,intz)
{
//返回
}
void Terrain::createTerrain()
{
glClearColor(0.0f、0.0f、0.0f、1.0f);
//设置高度图
glgenvertexarray(1,&uiVAOHeightmap);//创建一个VAO
glGenBuffers(1,&uivboheightmadata);//一个VBO用于数据
glGenBuffers(1,&uiVBOIndices);//最后是一个用于索引的VBO
glBindVertexArray(uiVAOHeightmap);
glBindBuffer(GL_数组_BUFFER,uivboheightmadata);
浮点数[HM\u大小X*HM\u大小Y]=
{
10.0f,10.0f,10.0f,10.0f,10.0f,10.0f,
5.0f、5.0f、5.0f、10.0f、10.0f、10.0f、,
5.0f、5.0f、5.0f、10.0f、10.0f、10.0f、,
5.0f,5.0f,10.0f,10.0f,10.0f,10.0f,
10.0f,10.0f,10.0f,10.0f,10.0f,10.0f,
10.0f,5.0f,5.0f,5.0f,5.0f,10.0f,
};
浮动fSizeX=100.0f,fSizeZ=100.0f;

对于(int i=0;如果步行,请计算哪个三角形在摄像机下方,并计算与它的垂直距离。如果它在摄像机下方,请后退移动步或将高度更改为
0
,以计算距离,您可以利用
三角形(正常
摄像机位置(地面)投影(摄像机)位置
步行ing只是移动相机。环顾四周就是旋转相机(请注意也要旋转相机上方向)。你的问题是什么?一个简单的解决方案是找到你站在哪个三角形上,计算三角形在该点的高度,然后限制你的位置不低于该高度。更好的解决方案是开始使用你可以使用的众多免费物理库/引擎中的一个。如果我不清楚这个问题,我很抱歉问题是没有移动,相机移动了,相机可以“飞”起来。我的问题是让它“走”在地形上,这是我不确定如何实现的。我知道我必须获得地形的Y值,并将其与相机的Y值进行比较,以确定相机是在地形之上还是之下。但我不确定如何实现它。