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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 19 февраля 2009

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

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

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

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

2 голосов
/ 19 февраля 2009

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

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

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

1 голос
/ 26 февраля 2009

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

1 голос
/ 21 февраля 2009

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

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

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

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

...