class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

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

Справка по математике

Преобразование координат

Матрицы являются пожалуй самым удобным инструментом описания преобразований координат и присутствуют во всех серьезных API для работы с трехмерной графикой как OpenGl и DirectX. Для свободного понимания данного материала необходимо знать основные сведения о матрицах, особенно правило их перемножения.

строко-ориентированные и столбцово-ориентированные матрицы
(row-major / column-major matrix)

Для устранения дальнейшей всякой путаницы, сразу разъясню, что существует два способа задания матриц преобразований: строко-ориентированное и столбцово-ориентированное. В чем их разница? Чтобы добавить новое преобразование N к текущей матрице преобразований M в случае столбцово-ориентированных матриц, мы должны умножить матрицу N на матрицу M справа:

M'=M*N.

Для строко-ориентированных матриц, мы должны умножить матрицу N на матрицу M слева:

M'=N*M.

Для получения новых координат вершины v(x,y,z,d), нужно умножить строку координат на матрицу преобразований справа для столбцово-ориентированной матрицы:v'(x',y',z',d') = v(x,y,z,d) * M;

Для строко-ориентированных необходимо столбец координат умножить на матрицу преобразований слева


                        x
v'(x',y',z',d') = M  *  y
                        z
                        d

Чтобы перевести матрицу из строко-ориентированной в столбцо-ориентированную или наоборот, необходимо лишь транспонировать ее.

базовые преобразования

Все остальные преобразования реализуются через них.

примеры базовых матриц

Ниже приведены строко-ориентированные матрицы преобразований для правосторонней системы координат (ось Х направлена влево, ось Y вверх, ось Z из экрана)

единичная матрица

Единичная матрица является матрицей тождественного преобразования, т.е. новые координаты равны старым. В таких API как OpenGl она является начальной матрицей преобразования, к которой добавляются все остальные.

сдвиг


                        |1 0 0 ax|
x'=x+ax                 |0 1 0 ay|
y'=y+ay -> (x',y',z',0)=|0 0 1 az| (x,y,z,1)T
z'=z+az                 |0 0 0 1 |

масштабирование

                       |bx 0 0 0|
x'=bxx                 |0 by 0 0|
y'=byy -> (x',y',z',0)=|0 0 bz 0|(x,y,z,1)T
z'=bzz                 |0 0 0 1 |

Если b равно -1, то получим зеркальное отражение относительно соответствующей оси.

поворот вокруг оси Z на угол alfa

                           |cos(alfa) -sin(alfa) 0 0|
x'=xcos(alfa)-ysin(alfa)   |sin(alfa)  cos(alfa) 0 0|
y'=xsin(alfa)+ycos(alfa) ->| 0           0       1 0|(x,y,z,1)T
z'=z                       | 0           0       0 1|
>

повороты вокруг оси X и Y

\>
| 1   0         0         0|  |cos(alfa)  0  sin(alfa) 0|
| 0 cos(alfa) -sin(alfa)  0|, |0          1   0        0|
| 0 sin(alfa)  cos(alfa)  0|  |-sin(alfa) 0  cos(alfa) 0|
| 0   0         0         1|  |0          0   0        1|

Знак - у sin соответствует правосторонней системе координат. Также легко запомнить, что cos на главной диагонали.

примеры прочих матриц

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

поворот вокруг вектора

а - уголь поворота

x,y,z нормализованные координаты вектор оси

t=1-cos(a)


|t*x2+cos(a)        t*x*y-sin(a)*z    t*x*z+sin(a)*y   0|
|t*x*y+sin(a)*z     t*y2+cos(a)       t*y*z-sin*x      0|
|t*x*z-sin(a)*y     t*y*z+sin(a)*x    t*z2+cos(a)      0|
| 0                          0                0        1|

перспективная проекция

Ограничиваем объем видимости шестью плоскостями:

r и l правая и левая отсекающие плоскости;

t и b верхняя и нижняя отсекающие плоскости;

f и n дальняя и ближняя плоскости.

Проекция происходит на ближнюю плоскость.

Координаты нормализуются.


| 2n/(r-l)  0          (r+l)/(r-l)    0         |
|   0       2n/(t-b)   (t+b)/(t-b)    0         |
|   0       0          -(f+n)/(f-n)   -2fn/(f-n)|
|   0       0          -1             0         |

(в OpenGl генерируется функцией glFrustum)

ортографическая проекция

Ограничиваем объем шестью плоскостями:

r и l правая и левая отсекающие плоскости;

t и b верхняя и нижняя отсекающие плоскости;

f и n дальняя и ближняя плоскости.

Проекция происходит на ближнюю плоскость.

Координаты нормализуются.


| 2/(r-l)   0          0         (r+l)/(r-l)|
|   0      2/(t-b)     0         (t+b)/(t-b)| 
|   0       0        -2f/(f-n)   (f+n)/(f-n)|
|   0       0          0             1      |

(в OpenGl генерируется функцией glOrtho)

скос на угол a в направлении x, z

| 1 ctg(a) 0  0|      | 1   0     0  0|
| 0   1    0  0|      | 0   1     0  0|
| 0   0    1  0|      | 0  ctg(a) 1  0|  
| 0   0    0  1|      | 0   0     0  1|

собственные матрицы преобразований

Чтобы вывести матрицу преобразования в простейшем случае необходимо выписать преобразование координат. Например, для скоса. Нарисуем прямоугольник, а затем параллелограм той же высоты и углом наклона (a) на координатной плоскости. Из простейших геометрических формул видно соотношение между новыми и старыми координатами:


x'=x + y*ctg(a)
y'=y
z'=z

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

В сложных случаях, конечное преобразование разбивается на ряд простейших, а после их матрицы перемножаются.

использование преобразования координат

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


Скачать класс Vector, класс Matrix4x4.


Рейтинг@Mail.ru