Управление чанками в игре на основе вокселей

Я работаю над java-игрой LWJGL, основанной на minecraft. Я работаю над управлением ландшафтом, что сложно, потому что мир может расширяться по мере того, как вы исследуете его. Как бы вы управляли ландшафтом, если бы он хранился в объектах чанков, и вам нужно было бы знать, какой чанк удалить из списка рендеринга, какой добавить и какой сгенерировать на основе позиции игрока по осям xyz?


person Mad3ngineer    schedule 07.07.2012    source источник
comment
Какая его часть вызывает у вас проблемы? Как бы то ни было, вопрос кажется слишком широким.   -  person biziclop    schedule 07.07.2012
comment
Часть, которая ставит меня в тупик, заключается в том, как хранить фрагменты таким образом, чтобы вы могли легко определить, визуализируются ли они, и удалить их, если вы находитесь далеко, или добавить их, если вы находитесь близко. Это сложно сделать, так как вы не можете использовать массив для бесконечного мира, а Arraylist трудно определить, какой фрагмент в индексе соответствует какой позиции xyz.   -  person Mad3ngineer    schedule 07.07.2012
comment
Я возвращаюсь теперь, когда понял это ... Причина, по которой я был в тупике, заключалась в том, что я так беспокоился о выступлении.   -  person Mad3ngineer    schedule 20.10.2012


Ответы (1)


Я работаю с медицинскими воксельными данными высокого разрешения и использую октодерево для их эффективного хранения.

Вы не можете использовать октодерево, потому что вам нужен динамически расширяющийся ландшафт (октодерево очень быстро, когда дело доходит до поиска, но очень медленно при построении/расширении).

Я предлагаю вам попробовать использовать HashMap, если вы предоставите хорошую хэш-функцию для Vector3, время поиска будет почти одинаковым для любого количества фрагментов (теоретически O (1), но это только лучший случай...).

Затем вы можете удалить все записи карты, которые находятся вне поля зрения, перебирая ключи карты (это можно сделать во вторичном потоке, который обрабатывает всю загрузку/выгрузку).

Надеюсь это поможет,

~ Локи

person Loki    schedule 21.08.2012
comment
Я обнаружил, что лучший способ — разделить каждый раздел мира так, чтобы один фрагмент имел массив из 16x16x16 блоков, затем регион имел массив из 16x16x16 фрагментов, а затем мир мог иметь массив из 117188x1x117188 регионов, всего 30000128 блоков в каждом направлении компаса (как в майнкрафте). В игре, над которой я работаю, размер массива немного отличается, но концепция та же. - person Brian_Entei; 24.09.2015
comment
И когда я говорю «массив», я имею в виду что-то вроде Block[][][] blocks = new Block[16][16][16];, а НЕ хэш-карту или список массивов; поскольку я пробовал их, и они кажутся намного медленнее, чем традиционный трехмерный массив. - person Brian_Entei; 24.09.2015