2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Проекция трехмерного объекта на плоскость
Сообщение01.11.2008, 18:28 
Здравствуйте!
Вопрос такой: В трехмерной ДСК нарисован кубик, ориентация произвольная, центр кубика совпадает с началом координат. Нужно отрисовать его на плоскости (вывести на мониторе =) ). Никак не могу сообразить, как спроецировать ось z на плоскость. Вопрос тривиален, знаю ))
P.S. Прогаю в С++, если это будет иметь значение )

 
 
 
 
Сообщение01.11.2008, 19:22 
Аватара пользователя
1) Задача сводится к проецированию одной точки (а потом ещё одной, а потом ещё одной, а потом соединяем линиями и т.д.).
2) Для того, спроецировать точку на плоскость, неплохо было бы задать эту плоскость (например, уравнением Ax+By+Cz+D=0), а также указать тип проекции (центральная или параллельная) и координаты центра (для центральной проекции) или компоненты вектора проецирования (для параллельной проекции).
3) Также нужно ввести на проектирующей плоскости систему координат экрана, т.е. задать на ней точки, соответствующие (0,0), (0,1) и (1,0) экранных координат.

Для примера ограничусь центральной проекцией.

3) Пусть началу экранных координат (0,0) соответствует точка $(x_{00}, y_{00}, z_{00})$, экранным координатам (0,1) --- точка $(x_{01}, y_{01}, z_{01})$, экранным координатам (1,0) --- точка $(x_{10}, y_{10}, z_{10})$. Эти 3 точки определяют плоскость, которая сопоставляет экранным координатам (p, q) точку $(x_{pq}, y_{pq}, z_{pq})$ по следующим формулам:
$$x_{pq} = x_{00} + p(x_{10}-x_{00}) + q(x_{01}-x_{00})$$
$$y_{pq} = y_{00} + p(y_{10}-y_{00}) + q(y_{01}-y_{00})$$
$$z_{pq} = z_{00} + p(z_{10}-z_{00}) + q(z_{01}-z_{00})$$
Эта же плоскость, разумеется, является плоскостью проекции.

2) Пусть центр проекции --- $(x_0, y_0, z_0)$. Для получения экранных координат проекции (p, q) произвольной точки $(x_1, y_1, z_1)$ на плоскость проекции нужно решить систему уравнений:
$$\left\{\begin{array}{l}
(x_{pq}-x_0)(y_1-y_0)-(y_{pq}-y_0)(x_1-x_0)=0\\
(x_{pq}-x_0)(z_1-z_0)-(z_{pq}-z_0)(x_1-x_0)=0\\
(y_{pq}-y_0)(z_1-z_0)-(z_{pq}-z_0)(y_1-y_0)=0
\end{array}\right.$$
Подставив сюда выражения для $x_{pq}$, $y_{pq}$, $z_{pq}$ из п. 3), получим систему из 3-х уравнений на 2 переменные --- p и q. Система переопределена, но имеет единственное решение, если $(x_1, y_1, z_1)$ не совпадает с $(x_0, y_0, z_0)$, и прямая, проходящая через эти 2 точки, не параллельна плоскости проекции. Для получения этого решения достаточно взять 2 линейно независимых уравнения системы (в типичном случае любые 2, но в вырожденных случаях одно из уравнений может выродиться в 0=0).

 
 
 
 
Сообщение01.11.2008, 21:40 
Аватара пользователя
Проекция делается легко.
В 3D графике обычно используется матрица 4 на 4. А вектор представлен как R=(x,y,z,w)
Где w=1 - вспомогательная велечина.
Проекционную матрицу умножаем на вектор R получаем Rp=(Xp,Yp,Zp) - спроектированный вектор.

Проекционная матрица может быть полученна различными способами. Часто применяют отрогональную и перспективную. К примеру для перспективной проекции

Введем термины
Обычно перспективная проекция задается следующими параметрами.

Fov- угол обзора камеры в играх выбирают 60°С 90°С 120°С.
Aspect - соотношение сторон экрана x'/ y', обычно 4/3; 5/4; 16/9 просто берем разрешения экрана и делим ширину на высоту.
NearPlane -передняя плоскость ее Z координата
FarPlane - задняя плоскость ее Z координата.
Объекты будут рисоваться только те, которые находятся между задней и передней плоскостью.

\begin{pmatrix}
h & 0 & 0 & 0\\
0 & w & 0 & 0\\
0 & 0 & a & b\\
0 & 0 & 1 & 0\end{pmatrix}

h=cot(Fov/2)
w=Aspect*h
a= FarPlane/(FarPlane-NearPlane)
b=-NearPlane*FarPlane/(FarPlane-NearPlane)

Если есть перспектива, то x_{new}=x_p/w_p, y_{new}=y_p/w_p, z_{new}=z_p/w_p
z - в дальнейшем используется в z буффере если нужно если ненужно просто отбрасываем
Дальше идут видовые преобразования . Преобразования координат полученных после применения проекционных преобразований нужно отмаштабировать и вывести на экран в видовое окно.

Экранные преобразование приведение проекционных координат к видовому окну.
Пусть окно имеет размер Width - ширина Height- высота
Left-левый край Top верхний крайн.

Код:
Left  Width
+---+----------+    экран
|   |          |   /
+-----------------+----+--------------->X
|   |          |  |    | Top
|   +----------+--|----+
|   |          |  |    |Height
|   |          |  |    |
|   +----------+--|----+
|               \ |
+-----------------+
|                 \окно
|
|
v
Y

x,y имеют проекционные координаты -1..+1
Где (1,1) -верхний правый угол окна
Где (-1,-1) -нижний левый угол окна

\begin{eqnarray}
x_v &=& left + width \cdot \frac{1+x_{new}}{2} \nonumber\\
y_v &=& top+ height \cdot \frac{1-y_{new}}{2} \nonumber\\
\end{eqnarray}

http://www.cs.kuleuven.ac.be/cwis/resea ... ngels.html

 
 
 
 
Сообщение02.11.2008, 01:34 
Аватара пользователя
Mono-X в сообщении #155145 писал(а):
Никак не могу сообразить, как спроецировать ось z на плоскость.


Имеется в виду, на плоскость $Oxy$? Как хотите. Берёте любую точку $(x_0,y_0,0)$ и отображаете точку $(0,0,z)$ в точку $(z\cdot x_0,z\cdot y_0,0)$ (параллельная проекция).

Посмотрите также "Проектирование пространства на плоскость".

 
 
 
 
Сообщение02.11.2008, 02:06 
Someone
Pavia
worm2
Спасибо, разобрался )

 
 
 
 
Сообщение29.12.2008, 20:50 
у меня такой вопрос по теме.Для чего конкретно нужно видовое преобразование и рассчитываются видовые координаты...не могу сформулировать на это точно ответ..

 
 
 
 
Сообщение14.02.2009, 12:32 
Аватара пользователя
я знаю вопрос глупый, но мне все равно не понятно
Pavia писал(а):
h=cot(Fov/2)


скажите пожалуйста, здесь "cot" - это имеется ввиду котангенс?

 
 
 
 
Сообщение14.02.2009, 14:35 
still писал(а):
скажите пожалуйста, здесь "cot" - это имеется ввиду котангенс?
Да: Trigonometric functions

 
 
 
 
Сообщение17.02.2009, 12:04 
Аватара пользователя
сделал перспективу по методу описанному здесь
Projections
и вот что у меня получилось (для просмотра нужен Adobe FlashPlayer 10 )
3d projection

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

 
 
 
 
Сообщение17.02.2009, 23:54 
Аватара пользователя
народ кто знает помогите пожалуйста, очень хочется научиться писать 3d с нуля...
я пишу свой 3d движок на ActionScript3, имея в руках только Vector3d и Matrix3d
все преобразования приходится делать руками ...

 
 
 
 
Сообщение19.02.2009, 09:31 
Аватара пользователя
still
Отсечение делать. Точки у которых z меньше 0(меньше передней плоскости) или z больше задний плоскости не выводить. Проще через Z-буффер. Правда тогда это очень медленно будет.

 
 
 
 
Сообщение20.02.2009, 12:31 
Аватара пользователя
что такое z-буффер? читал много форумов везде используют этот термин но ни где толком не объясняют что это такое и с чем его едят? :)

 
 
 
 
Сообщение21.02.2009, 00:25 
Аватара пользователя
Z-Буфер это очень просто.

Создается буфер высотой и шириной с экран.
Когда мы выводим 3D объекты на экран У каждой его точки есть Z координата.
Мы сравниваем эту точку с тем что записано в Z буфере. Если Z объекта которого мы рисуем меньше чем Z записанная в буфере, то точка помещается на экран и в z-буфер заноситься Z координата это точки.
Если Z точки больше чем z в z-буфере, то не выводим так как она перекрывается, той что уже выведена на экране.

И тут же проверяется точка находиться за передней проекционной плоскостью или нет. Так как после проекционной матрицы такая Z=0 то проверку делать очень легко.

Если Z<0 то точку не выводим.

http://algolist.manual.ru/graphics/3dfa ... les/33.php

Современная графика все делается на видео карте и там это просто аппаратно реализованно.

 
 
 
 
Сообщение21.02.2009, 16:39 
Аватара пользователя
теперь понятно, но в моем случае это не подойдет, потому что я не оперирую точками, у меня есть минимум треугольники, а сравнивать каждую точку всех треугольников будет очень накладно, т.к. FlashPlayer не обладает такой производительностью как современные видеокарты :) спасибо за разъяснение...

во общем я понял, необходимо перед выводом проверить не пересекается ли какая либо плоскость объекта с плоскостью проекции ... в случае пересечение выделить тот фрагмент который виден в данный момент ... будем копать в этом направлении :)

 
 
 
 Re: Проекция трехмерного объекта на плоскость
Сообщение09.12.2015, 20:53 
Скажите пожалуйста, как добиться эффекта, чтобы при уменьшении z заглянуть внутрь объекта?
Он у меня вроде есть, но отрисовываются линии, которых не должно быть. На рисунках ниже это хорошо видно:
Изображение
Изображение

Вот сам проект.
Матрицы брал готовые, просто чтобы быть уверенным, что не косяка в расчетах.

 
 
 [ Сообщений: 22 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group