Сфера Мир Реализация C ++ - PullRequest
6 голосов
/ 23 января 2009

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

Ответы [ 4 ]

7 голосов
/ 24 января 2009

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

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

5 голосов
/ 24 января 2009

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

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

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

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

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

4 голосов
/ 23 января 2009

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

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

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

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

2 голосов
/ 23 января 2009

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

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

...