
- •Элементы интерактивной компьютерной графики
- •Класс 2: двухуровневые или представляемые в нескольких «цветах» изображения
- •Структура графического изображения
- •Блок-схема графической системы
- •Методы кодирования графической информации
- •Позиционные методы кодирования ги. Рецепторный метод кодирования
- •Метод тетрарного дерева
- •Структурные методы кодирования Цепной метод кодирования
- •Кусочно – линейная аппроксимация контура изображения
- •Аппроксимация группы точек окружностью
- •Аналитические методы кодирования
- •Методы структурно – символического кодирования
- •Типичная система команд дисплейного процессора
- •Форматы дисплейных команд
- •А) Команды, управляющие лучом гд.
- •Геометрические преобразования
- •Двумерные преобразования Перенос (сдвиг)
- •Масштабирование
- •Поворот изображения
- •Однородные координаты и матричное представление двумерных преобразований
- •Композиция двумерных преобразований
- •Вопросы эффективности
- •Матричное представление трехмерных преобразований
- •Видовая операция (отсечение части изображения по прямоугольному окну)
- •Высокопроизводительные графические преобразования
- •Алгоритмы растровой графики
- •Алгоритм Брезенхэма для отрезков прямых
- •Растровая развертка окружностей
- •Алгоритм брезенхема для генерации окружности
- •Типы графических дисплеев Векторный дисплей
- •Организация памяти в растровых графических дисплеях
- •Организация дисплейного файла
Матричное представление трехмерных преобразований
Аналогично тому, как двумерные преобразования описываются матрицами размером 3x3, трехмерные преобразования могут быть представлены в виде матриц размером 4x4. И тогда трехмерная точка (х, у, z) записывается в однородных координатах как (W*x, W*y, W*z, W), где W0. Если W1, то для получения трехмерных декартовых координат точки (х, у, z) первые три однородные координаты делятся на W. Отсюда, в частности, следует, что две точки H1 и H2 в пространстве однородных координат описывают одну и ту же точку трехмерного пространства в том и только в том случае, когда H1 = С*H2 для любой константы С0.
Трехмерную систему координат будем считать правосторонней (рис.).
Правосторонняя система координат
Примем соглашение, в соответствии с которым положительными будем считать такие повороты, при которых (если смотреть с конца положительной полуоси в направлении начала координат) поворот на 900 против часовой стрелки будет переводить одну положительную полуось в другую. На основе этого соглашения строится следующая таблица, которую можно использовать IK для правых, так и для левых систем координат:
Если ось вращения |
Положительным будет направление поворота |
X Y Z |
От Y к Z От Z к X От X к Y |
Эти положительные направления отмечены также на рис.
Мы применяем здесь правостороннюю систему координат, поскольку она хорошо знакома большинству людей, хотя в трехмерной графике чаще более удобна левосторонняя система, так как ее легче представить наложенной на поверхность экрана дисплея позволяет естественно интерпретировать тот факт, что точки с большими значениями z находятся дальше от наблюдателя.
Y
Z
X
Отметим, что в левосторонней системе положительными будут повороты, выполняемые по часовой стрелке, если смотреть с конца положительной полуоси в направлении начала координат.
Трехмерный перенос является простым расширением двумерного:
10 0 0
01 0 0
M(mx my mz) = 0 0 1 0
mx my mz 1
т. e. [x y z 1] * M(mx, my, mz) = [x+mx y+my z+mz 1].
Начальная позиция Конечная позиция
Рис. Преобразование точек Р1, Р2 и Р3 из начальной позиции в конечную.
Масштабирование расширяется аналогичным образом:
Sx
0 0 0
0 Sy 0 0
S(Sx, Sy, Sz) = 0 0 Sz 0
0 0 0 1
В самом деле, [х у z l] * S(Sx, Sy, Sz) = [Sx*x Sy*y Sz*z I].
Двумерный поворот является в то же время трехмерным поворотом вокруг оси Z. В трехмерном пространстве поворот вокруг оси Z описывается выражением
cos
sin
0 0
- sin cos 0 0
Rz() = 0 0 1 0
0 0 0 1
Это легко проверить: в результате поворота на 90° вектора [1 0 0 1], являющегося единичным вектором оси х, должен получиться единичный вектор [0 1 0 1] оси у. Вычисляя произведение
0
1
0
0
— 1 0 0 0
[1 0 0 1] = 0 0 1 0
0 0 0 1
получаем предсказанный результат [0 1 0 1].
Матрица поворота вокруг оси X имеет вид
1
0 0 0
0 cos sin 0
Rx() = 0 - sin cos 0
0 0 0 1
Матрица поворота вокруг оси Y имеет вид
cos
0 -sin
0
0 1 0 0
Ry() = sin 0 cos 0
0 0 0 1
Столбцы (и строки) верхней левой подматрицы размером 3x3 матриц Rz(), Rx() и Ry() представляют собой взаимно ортогональные единичные векторы, интерпретация которых такая же, что и двумерном случае.
Все эти матрицы преобразований имеют обратные матрицы.
Матрица, обратная M, получается подстановкой знака минус перед mx, my и mz; обратная S — заменой Sx, Sy и Sz на обратные им значения, а для каждой из трех матриц поворота — выбором отрицательного угла поворота.
Результатом произвольной последовательности поворотов вокруг осей х, у и z является матрица А, имеющая вид
r11
r12
r13
0
r21 r22 r23 0
A = r31 r32 r33 0
0 0 0 1
Подматрицу поворота размером 3x3 называют ортогональной, поскольку ее столбцы являются взаимно ортогональными единичными векторами. При повороте, задаваемом матрицей, эти единичные векторы совмещаются с осями х, у и z. Иногда возникает необходимость определить матрицу поворота, соответствующую таким направлениям. Матрицы поворота сохраняют длину и углы, а матрицы масштабирования и переноса не сохраняют.
Можно перемножить произвольное число матриц поворота, масштабирования и переноса. Результат всегда будет иметь вид
R11
R12
R13
0
R21 R22 R23 0
A = R31 R32 R33 0 (**)
Mx
My
Mz
1
Верхняя левая подматрица R размером 3 х 3 (как прежде подматрица 2 х 2) будет описывать суммарные поворот и масштабирование, в то время как подматрица M будет задавать последующий совокупный перенос. С точки зрения быстродействия проведения вычислений выгоднее выполнять преобразования явно:
[x' y' z'] = [x y z] * R + M,
где R и M - подматрицы (**)