Порекомендовать какой-нибудь алгоритм Брезенхема для отображения сфер в 2D?

Мне нужен самый быстрый алгоритм отображения сфер. Что-то вроде того, что нарисовал Брезенхэм.
Что-то вроде реализации, которую я видел в Star Control 2 (вращающиеся планеты).
Существуют ли уже изобретенные и / или реализованные методы для этого?

Я действительно не хочу изобретать велосипед заново. Пожалуйста помоги...

Описание проблемы.
У меня есть место на 2D-поверхности, где должна появиться сфера. Сфера (пусть это будет Земля) должна быть текстурирована с мелкой картой и иметь возможность свободно масштабироваться и вращаться. Я хочу реализовать это с помощью карты или какой-то простой функции преобразования координат: каждый пиксель на 2D-изображении сферы определяется как количество пикселей из цилиндрической карты сферы. Это дает мне возможность реализовать сглаживание результирующего изображения. Также я думаю об использовании MIP-карт для реализации сопоставления, если один пиксель на результирующем изображении соответствует более чем одному пикселю на исходной карте (например, близко к полюсам сферы). Глубоко внутри я чувствую, что это можно реализовать с помощью некоторой тривиальной математики. Но все эти мысли - только мои мысли.

Этот вопрос немного связан с этим: Текстурированные сферы без сильных искажений, но на мой вопрос не было ответов.

UPD: Полагаю, у меня нет аппаратной поддержки. Я хочу иметь кроссплатформенное решение.


person avp    schedule 19.02.2009    source источник


Ответы (4)


Вы читали статьи Джима Блинна «Как нарисовать сферу»? У меня нет доступа к полным статьям, но похоже, что вам нужно.

person rotoglup    schedule 26.02.2009

Стандартный способ сделать такое отображение - это карта куба: сфера проецируется на 6 сторон куба. Современные видеокарты поддерживают этот вид текстуры на аппаратном уровне, включая полную фильтрацию текстур; Я считаю, что MIP-отображение также поддерживается.

Альтернативный метод (который явно не поддерживается оборудованием, но который может быть реализован с разумной производительностью с помощью процедурных шейдеров) - это параболическое отображение, которое проецирует сферу на две противоположные параболы (каждая из которых отображается на круг в середине квадратная текстура). Параболическая проекция не является проективным преобразованием, поэтому вам придется обрабатывать математику «вручную».

В обоих случаях искажение строго ограничено. Из-за аппаратной поддержки рекомендую кубическую карту.

person Community    schedule 19.02.2009
comment
Повторите ваше обновление о кроссплатформенности: OpenGL имеет кубические карты в качестве собственного типа текстуры, которую вы можете при желании mipmap. - person ; 19.02.2009
comment
OIC - вы хотите делать это все вручную! В этом случае подойдет любое отображение. По моему опыту, сложнее всего реализовать фильтрацию, и вы можете сделать сопоставление в значительной степени независимым от этого. - person ; 19.02.2009
comment
Ну ... да и нет. Я могу сделать алгоритм значительно быстрее, если смешаю все вместе. Я могу упростить математику и так далее. - person avp; 19.02.2009
comment
Таким образом, сфера должна хорошо работать - вы можете легко получить координаты (X, Y, Z), повернуть их с помощью матрицы 3x3, затем протестировать и нормализовать результат, чтобы выбрать и обработать свои карты текстур. В этом отношении параболическое отображение должно быть проще. Хотя фильтрация по-прежнему затруднена ... - person ; 19.02.2009
comment
... для сглаживания не думайте о карте от текстуры к сфере - думайте о карте от текстуры к экрану. Вы не можете предотвратить искажение края сферы, поэтому одного MIP-карт недостаточно для хорошего сглаживания. Аппаратное обеспечение использует анизотропную фильтрацию ... - person ; 19.02.2009
comment
... что сложно реализовать вручную, не говоря уже о медленном. На самом деле, вы можете подумать о радикальном сдвиге представления, например, о представлении вашей карты в виде облака точек и преобразовании точек вперед вместо отображения пикселей назад на набор текстур. Удачи! - person ; 19.02.2009
comment
Хехе, это действительно забавная идея с облаком точек :) Но оно действительно делает его не вперед, а назад, не так ли? Я имею в виду, просто потому, что тогда мы сможем пробежать через это облако, и тогда мы сможем отследить координаты этих точек. - person avp; 21.02.2009

Есть новый хороший способ сделать это: HEALPix.

Преимущества перед любым другим картографированием:

  1. Растровое изображение можно разделить на равные части (очень небольшое искажение)
  2. Очень простая, рекурсивная геометрия сферы с произвольной точностью.

Пример изображения.

person Aaron Digulla    schedule 19.02.2009
comment
Спасибо. Меня тоже очень удивил и порадовал этот простой трюк. - person Aaron Digulla; 19.02.2009

Я большой поклонник StarconII, но, к сожалению, не помню деталей того, как выглядел рисунок планеты ...

Первый вариант - это триангуляция сферы и рисование ее стандартными трехмерными полигонами. У него есть определенные недостатки с точки зрения универсальности, но он использует доступное аппаратное ускорение и может выглядеть достаточно хорошо.

Если вы хотите свернуть свой собственный, вы можете растрировать его самостоятельно. В книге Фоули, ван Дама и др. Компьютерная графика - принципы и практика есть глава, посвященная алгоритмам в стиле Брезенхема; вам нужен раздел «Сканирование, преобразование эллипсов».

Что касается идеи облака точек, которую я предлагал в предыдущих комментариях: вы можете избежать вопросов о параметризации во время выполнения, предварительно выбрав и сохранив координаты (x, y, z) точек поверхности вместо 2D-карты. Я думал о частичном рандомизации местоположений точек на сфере, чтобы они не вызывали структурированного алиасинга при преобразовании (вперед, назад, независимо от 8 ^) на экране. С другой стороны, вам придется иметь дело с фактором «заливки» - суммированием цветов по мере их рисования и делением на количество точек. Эээ, у вас также возникнет проблема, что делать, если нет очков; например, если вы хотите увеличить масштаб с очень большим увеличением, вам нужно будет сделать что-то вроде поиска ближайшей точки в этом случае.

person Community    schedule 20.02.2009
comment
comment
Что касается увеличения, мы можем использовать MIP-карты при сжатии и lerp для масштабирования. - person avp; 21.02.2009