1

我正在使用 OpenGL ES 2.0 编写 Java 示例项目,特别是 Android。我正在寻找一个让玩家移动的地形。玩家需要根据高度图在地形高度上下移动。地势并不平坦。我正在使用 Blender 创建地形和高度图。地形被导入为 obj 文件。

导入和绘图工作正常,但我在使坐标跟随高度图时遇到问题。它似乎没有100%遵循它。玩家每隔一段时间就会过快地上下移动,或者他会跌落到地形之下。

到目前为止我有什么:

1)我正在做的是将OBJ文件导入项目。读取距离地形对象最远的点并将其用作对象长度(此值 * 2)。这告诉我对象的一侧有多少个顶点。

2)然后我得到玩家位置与世界坐标中地形原点的差异。我将 x 和 z 值除以 OBJ 对象长度*2,得出对象所在的地形区域。这将给出玩家在 x 和 z 位置相对于地形的位置的百分比.

3)我打开高度图并将上面的百分比乘以高度图的图像,以获得高度图上的 x 和 y 位置以从中读取高度。

下面是我正在使用的。

到目前为止我所拥有的......高度图概述

   public float getHeightOfTerrain(float worldX, float worldZ){
       // worldX and worldZ are the players position
       // Currentmatrix is the matrix used for positioning the terrain
       float terrainX = worldX - CurrentMatrix[12] + objLength;
       float terrainZ = worldZ - CurrentMatrix[14] + objLength;

       return getHeight(terrainX, terrainZ);
    }
   ................
float MAX_HEIGHT = 20;
float MAX_PIXEL_COLOR = 256*256*256;
   ................

   public float getHeight(float x, float z){
       float posX = x / (objLength*2);
       float posZ = z / (objLength*2);

       if(posX < 0 || posX > 1 || posZ < 0 || posZ > 1){ // if over 1 which is 100% of terrain then return
           return 0;
       }
       float imgX = posX * bitmapOfMap.getWidth();
       float imgZ = bitmapOfMap.getHeight() - (posZ * bitmapOfMap.getHeight()); // subtract BC bitmap y reads in reverse

       if(imgX < 0 || imgX >= bitmapOfMap.getWidth() || imgZ < 0 || imgZ >= bitmapOfMap.getHeight()){ // if over then return
           return 0;
       }
       float height = bitmapOfMap.getPixel((int)imgX, (int)imgZ);
       height += MAX_PIXEL_COLOR/2f;
       height /= MAX_PIXEL_COLOR/2f;
       height *= MAX_HEIGHT;
       return height;
   }

地形高度越小,此设置的效果就越好。地形高度的变化越大,这个系统的效果就越差。我尝试了不同的 obj 和高度图,一遍又一遍地重新创建,认为这可能是问题,但存在相同的问题。

我这样做完全错了吗?任何帮助,将不胜感激。有人知道更好的方法吗?我真的很想保留我的 OBJ 文件导入并从中读取以进行自定义。

4

1 回答 1

1

我继续通过高度图创建地形,没有 OBJ 导入。然后在上面应用我的代码并遇到同样的问题。所以我一步一步地深入挖掘了到底发生了什么。这一切都是从我在 x、y 和 z 上跟踪地形位置的方式开始的,然后从玩家位置中减去它。我从一个单独的 x、y、z 数组中跟踪玩家的位置,然后从矩阵 [12]、矩阵 [13]、矩阵 [14] 作为 x、y、z 的地形位置。

这就是问题所在。我不能使用矩阵中的浮点数作为定位相对值。我还必须为地形保留单独的 x、y、z。

所以从......

   float terrainX = worldX - CurrentMatrix[12] + objLength;
   float terrainZ = worldZ - CurrentMatrix[14] + objLength;

   float x, y, z = 0; 

   .....

   float terrainX = z;
   float terrainZ = x;

现在该模型完美运行!.... 根据高度图在地形上适当上下移动。我希望这可以帮助任何可能遇到同样问题的人。

于 2014-12-21T22:34:03.507 回答