В следующих разделах описывается пошаговое создание трехмерных моделей в Flash. Начнем с кода, преобразуюшего трехмерные координаты в двумерные экранные координаты.
Преобразование координат
Местоположение объектов на экране определяется двумя координатами: x и у. Объекты в трехмерном пространстве должны иметь три координаты: x, у и z. Последняя определяет глубину.
Для отображения объектов на рабочем поле необходима функция, преобразуюшая x, у и z в экранные координаты x и у. Кроме того, вы будете наклонять и врашать объекты. Поэтому функция преобразования должна учитывать базовые наклоны и врашение.
Учтите, что это самый сложный сценарий из тех, которые мы до сих пор рассматривали и, возможно, из всех сценариев данной книги.
Математическая функция Math.atan (arctg, арктангенс) используется для преобразования координат в угол, а функции Math.sin и Math.cos – для преобразования значения углов обратно в координаты. Таким образом, координаты точки преобразуются в угол и расстояние от центра плоскости. Затем точка поворачивается и вновь преобразуется в координаты. Данное действие выполняется один раз для врашения и один раз для наклона. В результате вы получите координаты x и у, которые можно использовать на экране компьютера.
Комментарии, содержашиеся в нижеприведенном коде, объясняют, какое действие выполняет каждая его часть. Затем приводятся пошаговые объяснения.
// Переводим трехмерные координаты в координаты на экране
// (делаем проекцию).
function plotPoint(object) {
(1) → // Берем координаты объекта.
x = object.x;
o = object.o
z = object.z;
(2) → // Вычисляем расстояние от центра.
radius = Math.sqrt (x*x+y*y);
(3) → // Вычисляем первый угол.
if (x == 0) angle = Math.atan(l000000) [11] ;
else angle = Math.atan(y/x);
if (x < 0) angle += Math.PI;
(4) → // Поворачиваем объект.
angle += rotation;
(5) → // Вычисляем новые координаты.
realx = radius*Math.cos(angle);
realz = radius*Math.sin(angle);
realy = z;
(6) → // Определяем новое расстояние от центра.
radius = Math.sqrt(realy*realy+realz*realz);
(7) → // Вычисляем второй угол.
if (realz == 0) angle = Math.atan(1000000);
else angle = Math.atan(realy/realz);
if (realz < 0) angle += Math.PI;
(8) → // Добавляем угол наклона сечения.
angle += plane;
(9) → // Вычисляем координаты для экрана.
screenx = realx;
screeny = radius*Math.sin(angle);
screenz = radius*Math.cos(angle);
(10) → // Центрируем положение объекта.
screenx += 275;
screeny += 200;
(11) → // Возвращаем новые координаты.
return({x:screenx,y:screeny,z:screenz});Примечание
Функция Math. atan преобразует линию в угол в радианах. Необходимо указать значение разницы между начальной и конечной точками линии по вертикали, разделенное на значение этой же разницы по горизонтали. Например, если значения координат начальной и конечной точек линии соответственно равны (200, 200) и (275, 250), то, чтобы получить угол, необходимо записать Math.atan(75/50) . Результатом будет значение .9828 радиан, что составляет примерно 56°. В действительности функция Math.atan немного сложнее, однако данный пример позволит вам создать обшее представление о ней.
Опишем каждый шаг вышеприведенного кода:
(1) Задаются координаты x, у и z объекта.
(2) Вычисляется расстояние на плоскости xy от центра координат до проекции объекта на плоскость.
(3) Определяется угол на плоскости xy.
(4) Значение угла увеличивается на величину поворота объекта.
(5) Задаются новые координаты x, у и z с учетом изменения угла.