Вопрос

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

Это было полезно?

Решение

Для рендеринга вам нужно использовать какой-то алгоритм уровня детализации, чтобы плавно перемещаться от поверхности планеты к дальней. Существует множество динамических алгоритмов LOD ( см. Здесь ). Более старый алгоритм, называемый ROAM, может быть адаптирован для обработки сферических объектов или планет ( сферическая ROAM ). Gemapry clipmaps - это новый, более популярный алгоритм, который также можно адаптировать к сферическим поверхностям .

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

Другие советы

Если вы ищете что-то для хранения данных о поверхности, вы можете посмотреть на HEALpix , Это программное обеспечение, разработанное астрономическим сообществом специально для картирования неба (еще одна сферическая поверхность).

HEALpix создает сетку, которая описывает положение и размер поверхностей, и присваивает каждому идентификатор. Затем вы можете использовать этот идентификатор в качестве ключа или индекса, чтобы получить как можно больше информации об этом конкретном уровне.

HEASpix предоставляет методы для поиска соседних областей поверхности и может указывать позиции центра и вершины для каждой точки сетки.

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

В дистрибутиве есть много вещей, которые вам, вероятно, не понадобятся, но основные библиотеки должны быть полезны.

Это, вероятно, не то, что вы ищете ... Но какого черта. Это хорошая история.

Несколько лет назад, когда динозавры все еще бродили по земле, а память все еще измерялась в килобайтах, я играл с некоторым программным обеспечением для фрактальной генерации планет.

Идея состояла в том, чтобы создать прямоугольник размером 2NxN, представляющий планету. Разрежьте планету пополам несколько раз, слегка сдвигая две половины. (Синусоида для среза со случайным фазовым сдвигом и амплитудой. Еще одна случайная синусоида для смещения.) После этого залейте участки нижнего уровня водой и раскрасьте остальные цвета по высоте.

Затем поместите сферу диаметра N сверху и спроецируйте, обернув область NxN карты вокруг половины сферы. Переместите сферу вокруг карты, и выглядело, как будто она вращается.

Я бы предложил использовать какую-то полигональную модель в памяти, чтобы реализовать их в мирах, использовать файл для их хранения и визуализировать их с помощью какого-то 3D-движка.Либо так, либо просто центр указателя и радиус вместе с наложением для описания географии мира.

Редактировать:Спасибо за немного больше деталей.В зависимости от того, сколько деталей вам нужно, вам нужно будет использовать какой-то метод, чтобы разбить текстуру на более мелкие части — вы можете просто сгенерировать текстуру для 20 граней и построить Икосаэдр вокруг центральной точки.Взгляни на картографические проекции для некоторых мыслей о том, как это решается в реальной жизни.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top