Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1432 / 183 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 1:

Основы машинной графики

Изменим теперь положение координатных осей левосторонней системы координат таким образом, чтобы ось OY была направлена в плоскость рисунка. Тогда положительная полуось OZ будет направлена горизонтально вправо, а положительная полуось OX - вертикально вверх (рис. 1.10).


Рис. 1.10.

Получить формулу вращения точки вокруг оси OY на угол \beta можно заменив x на z, y на x в формуле двумерного поворота. При этом координата точки y при таком вращении не изменяется. В результате чего формула вращения точки (x,y,z) вокруг оси OY на угол \beta будет иметь следующий вид:

\left \{ \begin{array}{ccc} x'=xcos\beta-ysin\beta \\ y'=y \\ z'=xsin\beta+zcos\beta  \end{array}\right
или в матричной форме
(x', y', z' ) = (x, y, z) \left( \begin{array}{ccc} cos\beta & 0 & sin\beta \\ 0 & 1 & 0 \\ -sin\beta & 0 & cos\beta \end{array} \right)

Аналогично поступаем с осью вращения OX. Изменим положение координатных осей так, чтобы ось OX была направлена в плоскость рисунка, ось OY - горизонтально вправо, ось OZ - вертикально вверх (рис. 1.11).


Рис. 1.11.

Заменив в формуле двумерного поворота y на z, x на y, получим формулу вращения точки (x,y,z) вокруг оси OX на угол \alpha:

\left\{ \begin{array}{ccc} x'=x \\ y'=ycos\alpha-zsin\alpha \\ z'=ysin\alpha+zcos\alpha  \end{array}\right
или в матричной форме
(x', y', z' ) = (x, y, z) \left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & cos\alpha & sin\alpha \\ 0 & -sin\alpha & cos\alpha \end{array} \right)

Способ двумерного плоского вращения вокруг произвольной точки может быть обобщен на случай вращения вокруг произвольной оси трехмерного пространства. Пусть произвольная ось вращения задается вектором P_{1}P_{2}, причем P_{1}=(a,b,c) - точка, определяющая начало вектора, а P_{2}=(m,l,n) - конец вектора (рис. 1.12)


Рис. 1.12.

Вращение вокруг задаваемой оси (вектора P_{1}P_{2} ) на угол \theta выполняется в несколько этапов:

  1. Перенос вектора P_{1}P_{2} так, чтобы начало вектора (точка P_{1} ) совпала с началом системы координат. Это осуществляется с помощью операции сдвига T(-a,-b,-c) ;
  2. Поворот вокруг оси OY на угол \beta так, чтобы вектор (m,l,n) оказался в плоскости OYZ: R_{y}(\beta) ;
  3. Поворот вокруг оси OX на угол \alpha так, чтобы вектор (m',l',n') совпал с осью OZ: R_{x}(\alpha) ;
  4. Поворот вокруг оси OZ на заданный угол \theta: R_{x}(\theta ) ;
  5. Выполнение преобразования, обратного, произведенному на шаге 3. Т.е. поворот вокруг оси OX на угол -\alpha ;
  6. Выполнение преобразования, обратного, произведенному на шаге 2. Т.е. поворот вокруг оси OY на угол -\beta ;
  7. Выполнение преобразования, обратного, произведенному на шаге 1. Т.е. сдвиг на вектор (a,b,c): T(a,b,c)

Данный алгоритм вращения вокруг произвольной оси можно записать с помощью произведения серии элементарных матриц: V'=V*T(-a,-b,-c)*R_{y}(\beta)*R_{x}(\alpha)*R_{x}(\theta)*R_{x}(-\alpha)*\\R_{y}(-\beta)*T(a,b,c), где V - исходная точка, V' - точка после поворота.

Остается определить чему равны углы поворотов \alpha и \beta (рис. 1.13).


Рис. 1.13.

Из простых тригонометрических соотношений можно получить следующие формулы:

cos\beta=\frac{n}{\sqrt{m^{2}+n^{2}}}, cos\alpha=\frac{\sqrt{m^{2}+n^{2}}}{\sqrt{m^{2}+n^{2}+l^{2}}}

Как видно, операции трехмерного масштабирования и вращения могут быть реализованы с помощью умножения вектор-строки (точки) на матрицу преобразования. Операция же сдвига реализуется через сложение двух вектор-строк. Аналогично тому, как все двумерные преобразования (сдвиг, масштабирование и вращение) описываются матрицами размером 3х3 (через однородные координаты), трехмерные преобразования могут быть представлены в виде матриц размером 4х4. И тогда точка трехмерного пространства (x,y,z) записывается в однородных координатах как Wx,Wy,Wz,W, где W\ne 0. Если W\ne 1, то для получения трехмерных декартовых координат точки (x,y,z) первые три однородные координаты нужно разделить на W. Отсюда следует, что две точки H_{1} и H_{2} в пространстве однородных координат описывают одну и ту же точку трехмерного пространства в том и только том случае, когда H_{1}=cH_{2} для любой константы c не равной нулю. Таким образом, преобразование точки трехмерного пространства P=(x,y,z) в новую точку P'=(x',y',z') с использованием однородных координат можно записать как:

(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} a_{1} & a_{2} & a_{3} & 0 \\ a_{4} & a_{5} & a_{6} & 0 \\ a_{7} & a_{8} & a_{9} & 0 \\a_{10} & a_{11} & a_{12} & 1 \\ \end{array} \right).

Уравнения трехмерного сдвига, масштабирования и вращения записываются в виде матриц преобразования однородных координат следующим образом:

(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\Tx & Ty & Tz & 1 \\ \end{array} \right)=P*T(Tx,Ty,Tz)
(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} Sx & 0 & 0 & 0 \\ 0 & Sy & 0 & 0 \\ 0 & 0 & Sz & 0 \\0 & 0 & 0 & 1 \\ \end{array} \right)=P*S(Sx,Sy,Sz)
(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & cos\alpha & sin\alpha & 0 \\ 0 & -sin\alpha & cos\alpha & 0 \\0 & 0 & 0 & 1 \\ \end{array} \right)=P*R_{x}(\alpha)
(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} cos\beta & 0 & -sin\beta & 0 \\ 0 & 1 & 0 & 0 \\ sin\beta & 0 & cos\beta & 0 \\0 & 0 & 0 
& 1 \\ \end{array} \right)=P*R_{y}(\beta)
(x', y', z', 1) = (x, y, z, 1) \left( \begin{array}{cccc} cos\Upsilon & sin\Upsilon & 0 & 0 \\ -sin\Upsilon & cos\Upsilon & 0 & 0 \\ 0 & 0 & 1 & 0 \\0 & 0 & 0 & 1 \\ \end{array} \right)=P*R_{z}(\Upsilon),
где Tx,Ty,Tz - величины сдвига по осям OX, OY, OZ соответственно, Sx,Sy,Sz - масштабные множители по OX,OY,OZ соответственно, R_{x}(\alpha),R_{y}(\beta),R_{z}(\Upsilon) - матрицы вращения вокруг осей OX,OY,OZ на углы \alpha, \beta;, \Upsilon; соответственно.

Как и в двумерном случае, матричный подход позволяет совместить два или более элементарных преобразования в одно. Таким образом, последовательное применение двух преобразований T_{1} и T_{2} может быть заменено применением одного преобразования T, причем матрица T будет равна произведению матриц преобразований T_{1} и T_{2}. Это легко можно увидеть на простом примере. Пусть точка (x,y,z) трансформируется в точку (x',y',z') с помощью преобразования T_{1}: (x',y',z',1)=(x,y,z,1)T_{1}. Применяя затем преобразование T_{2} к точке (x',y',z'), получим точку (x'',y'',z'',1)=(x',y',z',1)T_{2}. Теперь подставляя первое выражение во второе, получим: (x'',y'',z'',1)=((x,y,z,1)T_{1})T_{2}=(x,y,z,1)(T_{1}T_{2}). Причем порядок применения преобразований должен быть сохранен при перемножении соответствующих матриц.

Процесс вывода трехмерной графической информации по существу является более сложным, чем соответствующий двумерный процесс. Сложность, характерная для трехмерного случая, обуславливается тем, что поверхность вывода не имеет графического третьего измерения. Такое несоответствие между пространственными объектами и плоскими изображениями устраняется путем введения проекций, которые отображают трехмерные объекты на двумерной проекционной картинной плоскости. В процессе вывода трехмерной графической информации мы задаем видимый объем в мировом пространстве, проекцию на картинную плоскость и поле вывода на видовой поверхности. В общем случае объекты, определенные в трехмерном мировом пространстве, отсекаются по границам трехмерного видимого объема и после этого проецируются. То, что попадает в пределы окна, которое само является проекцией видимого объема на картинную плоскость, затем преобразуется в поле вывода и отображается на графическом устройстве. В общем случае операция проекции преобразует точки, заданные в системе координат размерности n, в точки системы координат размерности меньшей, чем n. В нашем случае точка трехмерного пространства отображается в двумерное пространство. Проекция трехмерного объекта строится при помощи прямых проецирующих лучей, которые называются проекторами и которые выходят из центра проекции, проходят через каждую точку объекта и, пересекая картинную плоскость, образуют проекцию. На рис. 1.14 представлены две различные проекции одного и того же отрезка и проекторы, проходящие через его конечные точки.


Рис. 1.14.

Определенный таким образом класс проекций известен под названием плоских геометрических проекций, т.к. проецирование осуществляется на плоскость, а не на искривленную поверхность и в качестве проекторов используют прямые линии. Плоские геометрические проекции можно подразделить на два основных класса: центральные (перспективные) и параллельные (ортогональные). Различие между ними определяется соотношением между центром проекции и проекционной плоскостью. Так, если расстояние между ними, конечно, то проекция будет центральной, если же оно бесконечно, то – параллельной. При описании центральной проекции мы явно задаем ее центр проекции, в то время как для параллельной проекции мы указываем лишь направление проецирования. Центр проекции порождает визуальный эффект, аналогичный тому, к которому приводят фотографические системы и используется в случаях, когда желательно достичь некоторой степени реализма. Следует заметить, что размер центральной проекции объекта изменяется обратно пропорционально расстоянию от центра проекции до объекта. Параллельная проекция порождает менее реалистичное изображение, т.к. отсутствует перспективное "укорачивание" объекта. Проекция фиксирует истинные размеры объекта, и параллельные линии остаются параллельными.

В общем случае задача получения центральной проекции заключается в том, чтобы определить проекцию точки объекта, расположенную в произвольном месте трехмерного пространства, на некоторую плоскость в этом же пространстве, называемую картинной. Нахождение центральной проекции является частным случаем задачи определения пересечения луча L с плоскостью \alpha в трехмерном пространстве (рис. 1.15)


Рис. 1.15.

В машинной графике задача вычисления центральной проекции, как правило, сильно упрощена. В данном случае центр проекции, который также называют точкой зрения, находится на одной из осей системы координат, картинная (проекционная) плоскость перпендикулярна оптической оси. Как правило, точку зрения (центр проекции) располагают на оси OZ, тогда картинная плоскость будет параллельна плоскости OXY системы координат (рис. 1.16).


Рис. 1.16.

В нашем случае точка C=(0,0,c) - центр проекции (положение наблюдателя), плоскость z=0 - картинная плоскость. Пусть точка P=(x,y,z) имеет проекцию P'=(x',y',0). Рассмотрим два подобных треугольника CPQ и CP'Q', и запишем отношение катетов: \frac{P'Q'}{PQ}=\frac{C'Q'}{CQ}. Рассмотрим два других подобных треугольника CQ'O и CQB, и запишем отношения сторон для них: \frac{OQ'}{BQ}=\frac{CQ'}{CQ}. С другой стороны имеем: \frac{OQ'}{BQ}=\frac{OC}{BC}=\frac{c}{c-z}. Так как OQ'=x', BQ=x, P'Q'=y', PQ=y имеем

\left\{ \begin{array}{ccc} \frac{x'}{x}=\frac{c}{c-z} \\ \frac{y'}{y}=\frac{c}{c-z} \end{array}\right
или после преобразований
\left\{ \begin{array}{ccc} x'=x\frac{c}{c-z}=x\frac{1}{1-\frac{z}{c}} \\ y'=y\frac{c}{c-z}=y\frac{1}{1-\frac{z}{c}} \end{array}\right

Если теперь c стремится к бесконечности, то получим формулу параллельной проекции: \left\{ \begin{array}{ccc} x'=x \\ y'=y \end{array}\right.

Следующим шагом необходимо спроецированное изображение перевести в координаты экрана. Это можно проделать следующим образом:

\left\{ \begin{array}{ccc} X=X_{0}+x'l \\ Y=Y_{0}+y'l \end{array}\right,
где (X_{0},Y_{0}) - середина экрана, l - количество пикселей в единице.

Существует связь однородных координат с операцией центральной и параллельной проекциями, которая может быть выражена так: (X, Y, Z, H) = (x, y, z, 1) \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & -\frac{1}{c} \\0 & 0 & 0 & 1 \\ \end{array} \right)=(x,y,0,1-\frac{z}{c}).

Для перехода от однородных координат к обычным, необходимо разделить все компоненты точки на четвертую координату: \left\{ \begin{array}{cccc} x'=\frac{x}{1-\frac{z}{c}} \\ y'=\frac{y}{1-\frac{z}{c}} \end{array}\right.

Для параллельной проекции матрица преобразования будет иметь вид: (X, Y, Z, H) = (x, y, z, 1) \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\0 & 0 & 0 & 1 \\ \end{array} \right)=(x,y,0,1).

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

(X, Y, Z, H) = (x', y', z', 1) \left( \begin{array}{cccc} l & 0 & 0 & 0 \\ 0 & l & 0 & 0 \\ 0 & 0 & 0 & 0 \\X_{0} & Y_{0} & 0 & 1 \\ \end{array} \right)=(x'l+X_{0},y'l+Y_{0},0,1)
\left\{ \begin{array}{ccc} X_{экр}=x'l+X_{0} \\ Y_{экр}=y'l+Y_{0} \end{array}\right

Таким образом, все операции преобразования объекта трехмерного пространства на картинную плоскость (экран) можно описать в терминах матричных умножений.