@Qumico
Хочу написать игровой движок для 1 игры

Как массив вокселей 16^3 разделить на массивы по 4*8*8 и получить один из них по id?

Есть массив вокселей xyz 16^3 (voxel - это short, пока так))), массив заполнен случайными short
short voxels[16][16][16]
Что хочу сделать:
Разделить массив voxels на чанки по 4*8*8, взять чанк по id и вернуть vector вокселей в этом чанке
Для voxels[16][16][16] получилось бы 16 чанков по 4*8*8, один из этих чанков хочу получить по id и вернуть его воксели

Проблема с написанием этой функции:
*В функции учитываю что voxels может быть разного размера и чанк может быть разного размера
// voxel_size = 16
// world_length = voxel_size = 16
vector<short> get_voxels_from_chunk(short (*voxels)[voxel_size][voxel_size][voxel_size], int world_length, int chunk_size_x, int chunk_size_y, int chunk_size_z, int chunk_id) {
    vector<short> result;
    int x_offset; // смещение чанка по x
    int y_offset; // смещение чанка по y
    int z_offset; // смещение чанка по z
    for (int i = x_offset; i < x_offset+chunk_size_x; i++){
        for (int ii = y_offset; ii < y_offset+chunk_size_y; ii++){
            for (int iii = z_offset; iii < y_offset+chunk_size_z; iii++){
                result.push_back(*voxels[i][ii][iii]);
            }
        }
    }
}

В чём именно проблема:
Не могу посчитать offset, как мне его посчитать?

Если интересно для чего это всё:
Хочу попробовать написать сжатие атрибутов вокселей, по плану: воксель - id в таблице с информацией о вокселе, поэтому это массив short (кстати до этого я не писал на с++)
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
i229194964
@i229194964
Веб разработчик
#include <vector>

const int voxel_size = 16;

std::vector<short> get_voxels_from_chunk(short (*voxels)[voxel_size][voxel_size][voxel_size], int world_length, int chunk_size_x, int chunk_size_y, int chunk_size_z, int chunk_id) {
    std::vector<short> result;
    int chunk_count_x = world_length / chunk_size_x;
    int chunk_count_y = world_length / chunk_size_y;
    int chunk_count_z = world_length / chunk_size_z;
    int chunk_index_x = chunk_id % chunk_count_x;
    int chunk_index_y = (chunk_id / chunk_count_x) % chunk_count_y;
    int chunk_index_z = chunk_id / (chunk_count_x * chunk_count_y);
    int x_offset = chunk_index_x * chunk_size_x;
    int y_offset = chunk_index_y * chunk_size_y;
    int z_offset = chunk_index_z * chunk_size_z;
    for (int i = x_offset; i < x_offset + chunk_size_x; i++){
        for (int ii = y_offset; ii < y_offset + chunk_size_y; ii++){
            for (int iii = z_offset; iii < z_offset + chunk_size_z; iii++){
                result.push_back(*(*(*(voxels + i) + ii) + iii));
            }
        }
    }
    return result;
}

int main() {
    short voxels[voxel_size][voxel_size][voxel_size]; // пример массива вокселей
    int world_length = voxel_size;
    int chunk_size_x = 4;
    int chunk_size_y = 8;
    int chunk_size_z = 8;
    int chunk_id = 3; // пример id чанка
    std::vector<short> chunk_voxels = get_voxels_from_chunk(&voxels, world_length, chunk_size_x, chunk_size_y, chunk_size_z, chunk_id);
    // обработка chunk_voxels
    return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы