Я пытаюсь внедрить бесконечную генерацию ландшафта в мою OpenGL Java 3D-игру.У меня есть метод, который генерирует «кусок» местности, используя Perlin Noise.Все данные (вершины, индексы и т. Д.) Хранятся в классе MeshData.
Мой подход к этому (поправьте меня, если есть лучший) заключается в том, чтобы определить, когда игрок отошел от центрального чанка., основанный на сетке блоков 3х3.Следовательно, одновременно обрабатываются только 9 фрагментов.Моя проблема в том, что каждый блок генерирует свой собственный набор вершин, индексов, высот и т. Д., И я пытаюсь найти способ «объединить» все эти отдельные массивы в один мастер-массив, чтобы отобразить только один объект.Таким образом, все промежутки между кусками исчезнут из-за интерполяции.
Вот что у меня есть:
private void join(MeshData data, int id) {
// TODO: Join data to our own data at x, z
int count = (VERTEX_COUNT * VERTEX_COUNT) * 3;
int xPos = (id % 3) * count;
int zPos = (id / 3) * count;
for (int z = zPos; z < zPos + count; z++) {
for (int x = xPos; x < xPos + count; x++) {
}
}
}
ID - это число от 0 до 8 в сеткетаких кусков:
0, 1, 2,
3, 4, 5,
6, 7, 8
и, следовательно, xPos и yPos являются начальными позициями в основном массиве, который покрывает все вершины всех кусков.
Насколько я понял,Я не могу понять, как это закончить.Я был в этом в течение нескольких дней, но продолжаю застрять.Любая помощь / совет приветствуется.Спасибо!
Код, который показывает, как генерируются вершины каждого чанка:
private void generateChunk(int id, float x, float z) {
int count = VERTEX_COUNT * VERTEX_COUNT;
float[] vertices = new float[count*3];
float[] normals = new float[count*3];
float[] textureCoords = new float[count*2];
int vertexPointer = 0;
int intX = (int)x;
int intZ = (int)z;
for (int i = 0; i < VERTEX_COUNT; i++) {
for (int j = 0; j < VERTEX_COUNT; j++) {
vertices[vertexPointer * 3] = ((float) j / ((float) VERTEX_COUNT - 1) * CHUNK_SIZE) + x;
float height = getHeight(j + intX, i + intZ);
heights[j][i] = height; // <--
vertices[vertexPointer * 3 + 1] = height; // <--
vertices[vertexPointer * 3 + 2] = ((float) i / ((float) VERTEX_COUNT - 1) * CHUNK_SIZE) + z;
Vector3f normal = calculateNormal(j + intX, i + intZ);
normals[vertexPointer * 3] = normal.x;
normals[vertexPointer * 3 + 1] = normal.y;
normals[vertexPointer * 3 + 2] = normal.z;
textureCoords[vertexPointer * 2] = ((float) j / ((float) VERTEX_COUNT - 1)) + x;
textureCoords[vertexPointer * 2 + 1] = ((float) i / ((float) VERTEX_COUNT - 1)) + z;
vertexPointer++;
}
}
join(new MeshData(vertices, textureCoords, indices).setNormals(normals), id);
}
ОБНОВЛЕНИЕ:
Я достиг определенного прогресса в этом.Все вершины, нормали и текстурные координаты работают как надо.У меня сейчас проблемы с расчетом индексов для всей местности, а не только для одного куска.Я считаю, что этот код должен быть выполнен только один раз (а не для каждого куска), поэтому я удалил его из метода generateChunk ().Единственная проблема в том, что местность выглядит как на фото ниже, и я не уверен, почему.
int VERTEX_COUNT = 32 * 9;
indices = new int[(6 * ((VERTEX_COUNT) - 1) * ((VERTEX_COUNT) - 1))];
int pointer = 0;
for (int gz = 0; gz < (VERTEX_COUNT) - 1; gz++) {
for (int gx = 0; gx < (VERTEX_COUNT) - 1; gx++) {
int topLeft = ((gz * (VERTEX_COUNT)) + gx);
int topRight = topLeft + 1;
int bottomLeft = (((gz + 1) * (VERTEX_COUNT)) + gx);
int bottomRight = bottomLeft + 1;
indices[pointer++] = topLeft;
indices[pointer++] = bottomLeft;
indices[pointer++] = topRight;
indices[pointer++] = topRight;
indices[pointer++] = bottomLeft;
indices[pointer++] = bottomRight;
}
}