我有一个3D世界,我在其中创建了具有不同高度的完全平坦的瓷砖。我想要做的是将瓷砖的顶点拼接在一起,使它们在中间某处相遇并创建无缝地形。 (例如(侧视)从_¯到_ /¯)
目前,我将地图数据存储在包含x位置,z位置,高度和纹理的文本文件中。我在代码中创建了高度图,如下所示:
public static BufferedImage createHeightmapImage(int[][] vertexHeights) {
BufferedImage img = new BufferedImage(Heightmap.HEIGHTMAP_RESOLUTION, Heightmap.HEIGHTMAP_RESOLUTION, BufferedImage.TYPE_INT_ARGB);
int a = (255);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
int r = (vertexHeights[x][y]);
int g = (vertexHeights[x][y]);
int b = (vertexHeights[x][y]);
int p = (a << 24) | (r << 16) | (g << 8) | b;
img.setRGB(x, y, p);
}
}
AffineTransform transform = new AffineTransform();
transform.rotate(Math.toRadians(180), img.getWidth() / 2, img.getHeight() / 2);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
return img = op.filter(img, null);
}
它接收(当前4个)顶点高度,对于平坦的瓷砖,它们都是相同的。我将图像旋转180度,使其北边与我指定为北方的方向相同。
我的地图加载代码如下:
public GameMap loadMap(String name) {
ArrayList<MapData> mapData = getSortedMap(name);
List<Tile> tileList = new ArrayList<Tile>();
for (int i = 0; i < mapData.size(); i++) {
int worldX = mapData.get(i).getX();
int worldZ = mapData.get(i).getZ();
String texture = mapData.get(i).getTexture();
int heightmapValue = mapData.get(i).getHeight();
TileTexture tileTexture = new TileTexture(loadTexture(texture));
Heightmap heightmap = Tile.generateFlatHeightmap(heightmapValue);
Tile tile = new Tile(worldX, worldZ, this, tileTexture, heightmap);
tileList.add(tile);
}
GameMap map = new GameMap(name, tileList);
return map;
}
public ArrayList<MapData> getSortedMap(String name) {
ArrayList<MapData> data = FileUtils.getMapData(FileUtils.loadAsStringList("res/map/" + name + ".map"));
return data;
}
getSortedMap函数只是将地图数据加载到ArrayList中,并在给定x和z的情况下对其进行排序,以便我可以从左上角到右下角读取和加载地形。
我尝试创建一个更大的高度图图像,并为每个图块拍摄子图像,但最终会产生锯齿状的边缘或角落没有连接的地形。
我还试图在创建世界之后改变高度图以满足每个边缘和角落中间的顶点高度,但我找不到一种方法来做到这一点,而不会创建一堆乱七八糟的代码适用于一个高度图分辨率。我目前使用的分辨率为2x2,但如果它不符合我的需要,我会考虑增加它。