Я работаю над java-игрой LWJGL, основанной на minecraft. Я работаю над управлением ландшафтом, что сложно, потому что мир может расширяться по мере того, как вы исследуете его. Как бы вы управляли ландшафтом, если бы он хранился в объектах чанков, и вам нужно было бы знать, какой чанк удалить из списка рендеринга, какой добавить и какой сгенерировать на основе позиции игрока по осям xyz?
Управление чанками в игре на основе вокселей
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
Я обнаружил, что лучший способ — разделить каждый раздел мира так, чтобы один фрагмент имел массив из
16x16x16
блоков, затем регион имел массив из 16x16x16
фрагментов, а затем мир мог иметь массив из 117188x1x117188
регионов, всего 30000128
блоков в каждом направлении компаса (как в майнкрафте). В игре, над которой я работаю, размер массива немного отличается, но концепция та же.
- person Brian_Entei; 24.09.2015
И когда я говорю «массив», я имею в виду что-то вроде
Block[][][] blocks = new Block[16][16][16];
, а НЕ хэш-карту или список массивов; поскольку я пробовал их, и они кажутся намного медленнее, чем традиционный трехмерный массив.
- person Brian_Entei; 24.09.2015