Получить список видимых вокселей в сетке
Я работаю над игрой в стиле Minecraft, и мне нужен способ уменьшить количество визуализируемого мира. В настоящее время я использую наивный подход для рендеринга всего, у которого есть очевидные проблемы с масштабированием. Мне нужен способ взять массив блоков и каким-то образом выяснить, какие из них касаются воздуха, воды или любого другого полупрозрачного блока.
Я открыт для использования внешних модулей, таких как NumPy или SciPy, хотя некоторая их документация находится у меня над головой. В качестве альтернативы, было бы также приемлемо выполнять итерацию по каждому блоку и получать список соседей, хотя затраты на выполнение этих вычислений в Python вместо C были бы довольно значительными.
Для протокола, я уже пытался взглянуть на NetworkX, но, похоже, это больше для научного анализа или поиска путей, чем для проверки видимости.
2 ответа
Если вам нужно сделать это только один раз, производительность не должна быть проблемой. Если вы также постепенно обновляете .isBoundary
свойство блоков всякий раз, когда мир меняется, вам никогда не придется делать это снова.
Однако вы все еще сталкиваетесь с проблемами, если ваш мир слишком велик или полон дыр и пещер и прозрачен, чередуется с непрозрачным. Если вам нужно динамически определить, что видно, вы можете оставить октри ( http://en.wikipedia.org/wiki/Octree), где вы можете иметь гигантские пространства воздуха / воды / и т. Д. как один узел (гигантский блок), помеченный как "прозрачный". Затем используйте алгоритм "paintbucket" (модифицированный для выполнения алгоритма Дейкстры, чтобы легко было определить, когда вы "ушли за угол", проверив, существуют ли блоки между текущим блоком и источником), чтобы быстро выяснить, какие блоки в поле зрения. Обновление вещей, находящихся на большом расстоянии, может быть значительно отложено, если игрок движется медленно.