2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Проекция трехмерного объекта на плоскость
Сообщение01.11.2008, 18:28 


01/11/08
12
Здравствуйте!
Вопрос такой: В трехмерной ДСК нарисован кубик, ориентация произвольная, центр кубика совпадает с началом координат. Нужно отрисовать его на плоскости (вывести на мониторе =) ). Никак не могу сообразить, как спроецировать ось z на плоскость. Вопрос тривиален, знаю ))
P.S. Прогаю в С++, если это будет иметь значение )

 Профиль  
                  
 
 
Сообщение01.11.2008, 19:22 
Заслуженный участник
Аватара пользователя


01/08/06
3128
Уфа
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 
Аватара пользователя


31/10/08
1244
Проекция делается легко.
В 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 
Заслуженный участник
Аватара пользователя


23/07/05
17976
Москва
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 


01/11/08
12
Someone
Pavia
worm2
Спасибо, разобрался )

 Профиль  
                  
 
 
Сообщение29.12.2008, 20:50 


29/12/08
1
у меня такой вопрос по теме.Для чего конкретно нужно видовое преобразование и рассчитываются видовые координаты...не могу сформулировать на это точно ответ..

 Профиль  
                  
 
 
Сообщение14.02.2009, 12:32 
Аватара пользователя


14/02/09
5
Москва
я знаю вопрос глупый, но мне все равно не понятно
Pavia писал(а):
h=cot(Fov/2)


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

 Профиль  
                  
 
 
Сообщение14.02.2009, 14:35 
Заслуженный участник


15/05/05
3445
USA
still писал(а):
скажите пожалуйста, здесь "cot" - это имеется ввиду котангенс?
Да: Trigonometric functions

 Профиль  
                  
 
 
Сообщение17.02.2009, 12:04 
Аватара пользователя


14/02/09
5
Москва
сделал перспективу по методу описанному здесь
Projections
и вот что у меня получилось (для просмотра нужен Adobe FlashPlayer 10 )
3d projection

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

 Профиль  
                  
 
 
Сообщение17.02.2009, 23:54 
Аватара пользователя


14/02/09
5
Москва
народ кто знает помогите пожалуйста, очень хочется научиться писать 3d с нуля...
я пишу свой 3d движок на ActionScript3, имея в руках только Vector3d и Matrix3d
все преобразования приходится делать руками ...

 Профиль  
                  
 
 
Сообщение19.02.2009, 09:31 
Аватара пользователя


31/10/08
1244
still
Отсечение делать. Точки у которых z меньше 0(меньше передней плоскости) или z больше задний плоскости не выводить. Проще через Z-буффер. Правда тогда это очень медленно будет.

 Профиль  
                  
 
 
Сообщение20.02.2009, 12:31 
Аватара пользователя


14/02/09
5
Москва
что такое z-буффер? читал много форумов везде используют этот термин но ни где толком не объясняют что это такое и с чем его едят? :)

 Профиль  
                  
 
 
Сообщение21.02.2009, 00:25 
Аватара пользователя


31/10/08
1244
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 
Аватара пользователя


14/02/09
5
Москва
теперь понятно, но в моем случае это не подойдет, потому что я не оперирую точками, у меня есть минимум треугольники, а сравнивать каждую точку всех треугольников будет очень накладно, т.к. FlashPlayer не обладает такой производительностью как современные видеокарты :) спасибо за разъяснение...

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

 Профиль  
                  
 
 Re: Проекция трехмерного объекта на плоскость
Сообщение09.12.2015, 20:53 


09/12/15
2
Скажите пожалуйста, как добиться эффекта, чтобы при уменьшении z заглянуть внутрь объекта?
Он у меня вроде есть, но отрисовываются линии, которых не должно быть. На рисунках ниже это хорошо видно:
Изображение
Изображение

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group