【问题标题】:Android Height Mapping Imported OBJ file in OpenGL ES 2.0?Android 高度映射在 OpenGL ES 2.0 中导入 OBJ 文件?
【发布时间】:2014-12-22 06:34:03
【问题描述】:

我正在开发一个使用 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 文件导入并从中读取以进行自定义。

【问题讨论】:

    标签: java android opengl-es coordinates heightmap


    【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多