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