Проецирование 3d сферы в 2d круг на экране - PullRequest
3 голосов
/ 26 декабря 2008

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

Например: круг в (2,2,2) с радиусом 4 проецируется на пять пикселей: p1 (2,0) p2 (0,1) p3 (1,1) p4 (2,1) p5 (1,2)

Я сталкивался с такими методами, как разбрызгивание пикселей для систем частиц, но я не нашел четкого ответа о том, как это сделать.

Спасибо

Ответы [ 6 ]

1 голос
/ 26 декабря 2008

Какая у вас проекция?

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

*: ось симметрии вращения

0 голосов
/ 19 октября 2010

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

Предположим, что центр экрана (X = 0, Y = 0), а зритель расположен в (X = 0, Y = 0, Z = 0). Если сфера находится в точке (sX, sY, sZ) с радиусом sR, а экран находится на расстоянии D от наблюдателя (фокусное расстояние), то круг будет иметь вид (cX = sX * D / sZ, cY = sY * D / sZ) с радиусом cR = sR * D / sZ. Все просто масштабируется по D / sZ.

Этот круг является хорошим приближением к проекции сферы, если фокусное расстояние (D) велико или координаты sX и sY сферы близки к нулю.

0 голосов
/ 17 января 2009

круто, поэтому предположим, что вы просто берете x, y из x, y, z сферы, чтобы сформировать ваш круг. Как вы делаете затенение соответствующих пикселей в пиксельной сетке? Каков алгоритм растеризации круга?

0 голосов
/ 02 января 2009

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

Я начну с предположения, что вы можете перемещать, вращать и изменять размеры сферы в соответствии с системой координат спроецированной окружности. Назовем r радиусом для них обоих и предположим, что центр находится в (0,0,0) для сферы и (0,0) для круга. Ось X движется влево-вправо для обоих, ось Y движется снизу вверх для обоих, а ось Z движется назад к фронту для сферы.

Вот самое интересное: все готово. Координаты X и Y одинаковы как для сферы, так и для круга! Если координата Z положительна, точка видна, если она отрицательна, точка скрыта на обратной стороне сферы.

0 голосов
/ 01 января 2009

Возможно, самый простой способ (если вы не возражаете против некоторой линейной алгебры) - это использовать матрицу преобразования проекции 4x4. Фактически, практически любой вид трехмерного преобразования может быть выполнен с использованием матрицы 4x4.

Вот статья Википедии , с которой можно начать.

0 голосов
/ 26 декабря 2008

Я не понимаю вашу проблему на 100%. Ваша пиксельная сетка = пиксель в пространстве экрана или есть фиксированное соотношение?

Насколько я понимаю, вы можете попробовать это:

Сопоставьте координату порта внутреннего вида с пикселем пространства экрана и рассчитайте соотношение. Используйте это соотношение, чтобы разместить ваш объект именно там, где вы хотели. Я написал D3D-приложения, основанные на Windows (не полноэкранные), используя этот метод, чтобы обеспечить взаимодействие мыши с 3D-объектами. Это позволяет перемещать и изменять размер объекта с помощью мыши, что делает его похожим на обычные приложения Windows. Мне нужно было рассчитать соотношение методом проб и ошибок (мне не понравилось матричное вычисление).

Если вы не потревожили матрицу проекции вида, как я делал выше, 3D-координата будет от -1,0f до 1,0f слева направо и снизу вверх. Таким образом, вы можете легко определить соотношение и правильно разместить ваш объект, используя тот же метод, что и выше

...