Добавление массивов в больший массив в виде сетки? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь внедрить бесконечную генерацию ландшафта в мою 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;
        }
    }

enter image description here

...