四分木システムを使用して地形をレンダリングしています。splitHeightmap(float[] originalMap, int quadrant)
象限が 0 ~ 3 の数値であるメソッドを使用して、高さマップを 4 つのセクションに分割する必要があります。マップは 4 分の 1 に分割する必要があるため、象限として 0 を渡すと、配列の左下の 4 分の 1 が新しい float 配列として返されます。私は小さな基本コードを持っていますが、目的の象限に応じて実際にマップをサンプリングする方法がわかりません:
protected float[] splitHeightMap(float[] heightMap, TerrainQuadrant quadrant) {
float[] newHeightMap = new float[size >> 1];
int newSize = size >> 1;
for (int i = 0; i < newSize; i++)
for (int j = 0; j < newSize; j++)
newHeightMap[i * newSize + j] = sampleHeightAt(heightMap, i, j);
return newHeightMap;
}
protected float sampleHeightAt(float[] heightMap, int x, int z) {
return heightMap[z + x * size];
}
編集:私はうまくいくと思うものを書きましたが、インデックス 65792 の ArrayIndexOutOfBoundsException を取得しています (元の高さマップは 512x512 です):
protected float[] splitHeightMap(float[] heightMap, TerrainQuadrant quadrant) {
float[] newHeightMap = new float[(size >> 1) * (size >> 1)];
int newSize = size >> 1;
int xOffset = 0, zOffset = 0;
int xCount = 0, yCount = 0;
switch (quadrant) {
case BottomRight:
xOffset = newSize;
break;
case TopLeft:
zOffset = newSize;
break;
case TopRight:
xOffset = newSize;
zOffset = newSize;
break;
default:
break;
}
for (int x = xOffset; x < xOffset + newSize; x++)
for (int z = zOffset; z < zOffset + newSize; z++) {
newHeightMap[xCount + yCount * newSize] = heightMap[z + x * size]; // should this be 'z + x * size' or 'x + z * size'?
xCount++;
yCount++;
}
return newHeightMap;
}