Android高度映射在OpenGL ES 2.0中导入的OBJ文件?

时间:2014-12-15 15:56:13

标签: java android opengl-es coordinates heightmap

我正在使用OpenGL ES 2.0开发Java中的示例项目,特别是Android。我希望为玩家创造一个移动的地形。玩家需要在高度图之后上下移动地形。地形不平坦。我正在使用Blender来创建地形和高度图。正在将地形导入为obj文件。

导入和绘图工作正常,但我有问题使坐标遵循高度图。它似乎没有100%跟随它。玩家经常上下移动太快或者跌落在地形之下。

我到目前为止:

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

2)然后,我将球员位置与世界坐标中的地形原点区分开来。我取x和z值并将每个值除以OBJ物体长度* 2,得到物体所在地形区域。这将给出玩家参考地形的x和z位置的百分比

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

以下是我正在使用的内容。

What I have so far... Heightmap overview

   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和heightmaps,一遍又一遍地重新思考这可能是问题,但存在同样的问题。

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

1 个答案:

答案 0 :(得分: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;

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