Опубликован: 20.10.2007 | Доступ: свободный | Студентов: 3775 / 854 | Оценка: 4.38 / 3.99 | Длительность: 12:07:00
ISBN: 978-5-94774-654-9
Специальности: Программист
Лекция 7:

Проецирование пространственных сцен

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Центральные проекции

Предположим, что центр проекции находится в точке \overrightarrow{c}=(c_x,c_y,c_z), а картинная плоскость совпадает с плоскостью XOY. Возьмем произвольную точку изображаемого объекта \overrightarrow{M}=(x,y,z) и определим ее проекцию на выбранную плоскость (рис. 7.7).

Центральная проекция на плоскость XOY

Рис. 7.7. Центральная проекция на плоскость XOY

Прямую, проходящую через точки \overrightarrow{c} и \overrightarrow{M}, зададим в параметрическом виде:

\overrightarrow{r}(t)=\overrightarrow{c}+t\cdot(\overrightarrow{M}-\overrightarrow{c})=
(c_x+t\cdot(x-c_x),c_y+t\cdot(y-c_y),c_z+\\+t\cdot(z-c_z)). ( 7.1)

Теперь найдем точку пересечения этой прямой с картинной плоскостью. Она определяется из условия равенства нулю третьей координаты:

c_z+t\cdot(z-c_z)=0,
откуда определяем значение параметра t, при котором точка прямой принадлежит координатной плоскости:
t^*=\frac{c_z}{c_z-z}=\frac{1}{1-\frac{z}{c_z}}.

Подставляя это значение в формулу (7.1), мы получим координаты проекции точки \overrightarrow{M}:

x^*=c_x+\frac{x-c_x}{1-\frac{z}{c_z}}, \quad
y^*=c_y+\frac{y-c_y}{1-\frac{z}{c_z}}. ( 7.2)

Фактором, влияющим на перспективное изменение размеров, является наличие координаты z в знаменателе. Чем ближе оказывается точка к центру проекции, тем больше знаменатель, а соответственно и координаты точки.

Мы будем рассматривать ситуацию, когда центр проекции лежит на оси OZ, а сама ось направлена от наблюдателя к проекционной плоскости, т.е. c_x=x_y=0,\quad c_z=-d, \; d>0. Тогда формулы (7.2) приобретают вид

x^*=\frac{x}{1+\frac{z}{d}}, \quad
y^*=\frac{y}{1+\frac{z}{d}}. ( 7.3)

В однородных координатах такое преобразование можно записать с помощью двух операций. Сначала умножаем матрицу проективного преобразования P_z на исходную точку и получаем точку в четырехмерном пространстве:

P_z\cdot
\begin{pmatrix}
x \\ y \\ z \\ 1
\end{pmatrix}
\equiv
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & 1/d & 1
\end{pmatrix}
\begin{pmatrix}
x \\ y \\ z \\ 1
\end{pmatrix} =
\begin{pmatrix}
x \\ y \\ 0 \\ 1+z/d
\end{pmatrix}. ( 7.4)

Затем проецируем эту точку в пространство однородных координат путем деления на четвертую компоненту:

(x^*,y^*,0,1)=(x/p,y/p,0,1), \quad p=1+z/d.

Посмотрим теперь, что происходит с пучком параллельных прямых под действием матрицы проекции. Пусть задан пучок прямых, параллельных вектору \overrightarrow{v}=(a,b,c). Тогда параметрическое уравнение прямой, принадлежащей этому пучку, имеет вид

\overrightarrow{r}=(x+at,y+bt,z+ct).

Из формулы (7.4) следует, что в результате проецирования получим множество точек

\left(
x+at,y+bt,0,1+\frac{z+ct}{d}
\right) .

Переходя к однородным координатам и умножив числитель и знаменатель каждой дроби на d, получим точки \overrightarrow{r}_0 вида

\overrightarrow{r}_0=
\left(
d\frac{x+at}{d+z+ct},d\frac{y+bt}{d+z+ct},0,1
\right) .

Теперь в каждой компоненте вектора числитель и знаменатель поделим на t:

\overrightarrow{r}_0=
\left(
d\frac{x/t+a}{(d+z)/t+c},d\frac{y/t+b}{(d+z)/t+c},0,1
\right) .

Переходя к пределу при t\rightarrow\infty, получим точку

\overrightarrow{r}_{\infty}=
\left(
\frac{da}{c},\frac{db}{c},0,1
\right) .

Таким образом, получаем, что после проецирования пучок параллельных прямых пересекается в точке схода \overrightarrow{r}_{\infty}. Понятно, что у каждого пучка своя точка схода. Если пучок прямых параллелен плоскости XOY, т.е. c=0, то точка схода оказывается на бесконечности, а значит, прямые остаются параллельными.

Для построения перспективной проекции с несколькими точками схода используется матрица перспективного преобразования без проецирования:

P=
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
1/d_1 & 1/d_2 & 1/d_3 & 1
\end{pmatrix} .

Теперь точки пространства сначала подвергаются перспективному преобразованию, а затем осуществляется проекция.

Определим точки схода для прямых, параллельных осям координат. Для прямых \overrightarrow{r}=(x,y,z+ct) результатом проективного преобразования будет множество точек (x/f,y/f,(z+ct)/f,1), где f=x/d_1+y/d_2+(z+ct)/d_3+1. При t\rightarrow\infty получим точку с координатами (0,0,d_3,1). При проекции на плоскость XOY получим точку (0,0). Пучок прямых \overrightarrow{r}=(x+ct,y,z) перейдет в ((x+ct)/f_1,y/f_1,z/f_1,1),\;f_1=(x+ct)/d_1+y/d_2+z/d_3+1, а точкой схода для него будет (d_1,0,0,1), которая при проецировании перейдет в точку, лежащую на оси OX \; (d_1,0). Аналогично для пучка прямых, параллельных оси OY, получим точку схода на оси OY \; (0,d_2). Эти три точки на плоскости являются главными точками схода.

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Дмитрий Трефилов
Дмитрий Трефилов

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!