Это - первая часть из курса статей "3d обучение". Здесь
будут рассмотрены основные 3d преобразования и как их эффективней
реализовать в flash mx.
Содержание.
Введение.
1. Основы.
1.1 - координаты точки
1.2 - система координат
2. Преобразование поворота.
2.1 - поворот вокруг координатных осей относительно центра координат
2.2 - поворот вокруг координатных осей относительно произвольной точки
2.3 - поворот вокруг произвольной оси относительно центра координат
2.4 - поворот вокруг произвольной оси относительно произвольной точки
3. Преобразование масштабирования.
3.1 - масштабирование относительно центра координат
3.2 - масштабирование относительно произвольной точки
4. Преобразование сдвига.
4.1 - сдвиг начала координат
5. Проецирование.
5.1 - перспективное проецирование
6. Комбинирование преобразований.
6.1 - последовательное выполнение сдвигов
6.2 - последовательное выполнение поворотов
6.3 - последовательное выполнение масштабирований
Заключение.

1. Основы.
Предполагаемые обозначения в тексте
x, y, z - координаты точки
x', y', z' - новые координаты точки
xp, yp - проецированные координаты точки
dist - дистанция от точки наблюдения (позиции камеры) до центра координат
cnx, cny - координаты центра клипа
sin(A), cos(A), tan(A) - синус, косинус и тангенс угла A
rad = Math.PI/180 - коэффициет перевода градусов в радианы и обратно
1.1 Координаты точки.
Точка в 3d пространстве имеет три координаты (x,y,z) - это расстояние
от каждой из осей до самой точки. К примеру координаты (1, 2, 3) означают,
что точка расположена на расстоянии 1 от оси X, на расстоянии 2 от
оси Y и на расстоянии 3 от оси Z.
1.2 Система координат.
В нашем случае мы будем применять правую систему координат. Правая
система координат наиболее часто применяется в машинной графике.
определение: Система координат называется правой, если для совмещения
с положительной полуосью Y положительную полуось X требуется повернуть
на +90° при этом направление движения расположенного вдоль оси
Z и поворачивающегося против часовой стрелки правого винта и положительной
полуоси Z совпадают.
2. Преобразование поворота.
Преобразование поворота играет важнейшую роль в 3d движениях. Без
него невозможны плавные движения облёта, вращения и др. основополагающие
движения камеры.
2.1 Поворот вокруг координатных осей относительно центра координат.
Самым лёгким поворотом является поворот вокруг координатной оси.
Формулы поворота вокруг координатных осей на угол A
- вокруг оси X
x' = x;
y' = y*cos(A)-z*sin(A);
z' = y*sin(A)+z*cos(A);
- вокруг оси Y
x' = x*cos(A)+z*sin(A);
y' = y;
z' = -x*sin(A)+z*cos(A);
- вокруг оси Z
x' = x*cos(A)-y*sin(A);
y' = x*sin(A)+y*cos(A);
z' = z;
2.2 Поворот вокруг координатных осей относительно произвольной точки.
Смысл поворота вокруг произвольной точки:
- делаем сдвиг начала координат в нужную точку
- производим поворот
- возвращаем центр координат обратно на место
Формулы поворота относительно точки M(x0,y0,z0) на угол A
- вокруг оси X
x' = x;
y' = y0+(y-y0)*cos(A)+(z0-z)*sin(A);
z' = z0+(y-y0)*sin(A)+(z-z0)*cos(A);
- вокруг оси Y
x' = x0+(x-x0)*cos(A)+(z-z0)*sin(A);
y' = y;
z' = z0+(x0-x)*sin(A)+(z-z0)*cos(A);
- вокруг оси Z
x' = x0+(x-x0)*cos(A)+(y0-y)*sin(A);
y' = y0+(x-x0)*sin(A)+(y-y0)*cos(A);
z' = z;
2.3 Поворот вокруг произвольной оси относительно центра координат.
Вращение вокруг произвольной оси немного сложнее. Его нужно непременно
знать и понимать.
Формулы поворота на угол A вокруг произвольной оси (alpha, beta, gamma)
temp = 1.0-cos(A);
x' = x*(alpha*temp*alpha + cos(A)) + y*(beta*temp*alpha - sin(A)*gamma)
+ z*(gamma*temp*alpha + sin(A)*beta);
y' = x*(alpha*temp*beta + sin(A)*gamma) + y*(beta*temp*beta + cos(A))
+ z*(gamma*temp*beta - sin(A)*alpha);
z' = x*(alpha*temp*gamma - sin(A)*beta) + y*(beta*temp*gamma + sin(A)*alpha)
+ z*(gamma*temp*gamma + cos(A));
2.4 Поворот вокруг произвольной оси относительно произвольной точки.
Смысл поворота относительно произвольной точки вокруг произвольной
оси:
- делаем сдвиг начала координат в нужную точку
- производим поворот вокруг произвольной оси
- возвращаем центр координат обратно на место
Формулы поворота на угол A вокруг произвольной оси (alpha, beta, gamma)
относительно точки M(x0, y0, z0)
temp = 1.0-cos(A);
x'
= x0 + (x-x0)*(alpha*temp*alpha + cos(A)) + (y-y0)*(beta*temp*alpha
- sin(A)*gamma) + (z-z0)*(gamma*temp*alpha + sin(A)*beta);
y'
= y0 + (x-x0)*(alpha*temp*beta + sin(A)*gamma) + (y-y0)*(beta*temp*beta
+ cos(A)) + (z-z0)*(gamma*temp*beta - sin(A)*alpha);
z'
= z0 + (x-x0)*(alpha*temp*gamma - sin(A)*beta) + (y-y0)*(beta*temp*gamma
+ sin(A)*alpha) + (z-z0)*(gamma*temp*gamma + cos(A));
3. Преобразование
масштабирования.
Преобразование масштабирования это - изменение размера, изменение
масштаба.
3.1 Масштабирование относительно центра координат.
Наипростейшим масштабированием является масштабирование относительно
центра координат. Это достаточно часто используемое преобразование.
Sx, Sy, Sz - коэффициенты масштабирования по осям X, Y и Z
Формула масштабирования:
x' = x*Sx;
y' = y*Sy;
z' = z*Sz;
3.2 Масштабирование относительно произвольной точки.
Данное преобразование нужно в основном для увеличения отдельных деталей
фигуры. Допустим вам нужно промасштабировать один кубик. Делаем сдвиг
центра координат в центр кубика, масштабируем все точки куба, и возвращаем
центр координат на место. Вуаля - кубик увеличился в размерах не сдвигаясь
со своего места.
Смысл масштабирования относительно произвольной точки:
- делаем сдвиг начала координат в нужную точку
- производим масштабирование
- возвращаем центр координат обратно на место
Формула масштабирования относительно произвольной точки M(x0,y0,z0):
x' = x0+(x-x0)*Sx;
y' = y0+(y-y0)*Sy;
z' = z0+(z-z0)*Sz;
4. Преобразование сдвига.
Название говорит само за себя - изменение позиции точки.
4.1 Сдвиг начала координат.
incX, incY, incZ - величина сдвига по осям X, Y и Z;
Формула преобразования сдвига:
x' = x+incX;
y' = y+incY;
z' = z+incZ;
5. Проецирование.
Прошу не путать. Все вычисления производятся исключительно с нормальными
координатами. Проецирование производится в самом конце, и оно не запоминается
и не заменяет координат точки. Оно лишь нужно для визуально более
реального изображения (получения перспективы) и перехода от 3d координат
к 2d (монитор-то 2d, а не 3d)!
5.1 Перспективное проецирование.
Формула перспективного проецирования:
rx = cnx + x*dist/(dist+z);
ry = cny - y*dist/(dist+z);
6. Комбинирование преобразований.
Последовательное выполнение нескольких преобразований можно представить
в виде единого преобразования. Это затрачивает меньше ресурсов машины.
6.1 Последовательное выполнение сдвигов.
Сдвиг аддитивен, т.е. последовательное выполнение сдвигов на расстояние
(T1.x, T1.y, T1.z) и (T2.x, T2.y, T2.z) эквивалентно одному сдвигу
на расстояние (T1.x + T2.x, T1.y + T2.y, T1.z + T2.z).
6.2 Последовательное выполнение поворотов.
Можно показать, что два последовательных поворота аддитивны. Например
повернём точку на угол 45° и после этого повернём на угол -67°.
Это эквивалентно повороту на угол (45° + (-67°)) = -22°.
6.3 Последовательное выполнение масштабирований.
Первое масштабирование с коэффициентами (Sx1, Sy1, Sz1) второе с коэффициентами
(Sx2, Sy2, Sz2). Следует ожидать, что суммарное масштабирование будет
мультипликативным. А именно последовательное выполнение этих масштабирований
даст результат, эквивалентный масштабированию (Sx1*Sx2, Sy1*Sy2, Sz1*Sz2).
Заключение.
С помошью этих формул можно производить любые 3d преобразования. Конечно,
в матричных вычислениях это намного удобнее, и выглядело бы это всё
лучше, но и ресурсов оно бы занимало намного больше.
В следующих статьях будет также: 3d движок на матрицах 4x4 с движениями
произвольной камеры, 3d освещение, 3d сортировка, 3d удаление невидимых
граней, 3d тень и так далее.
Удачи!
Всегда Ваш Григорий Рябов / Nuran.
Сделано специально для flasher.ru.
Продолжение следует...
Перепечатка данного материала строго запрещена!
|
|