Эффект трехмерности
Исходные файлы: 3d.fla, 3dcubepoints.fla, 3dcube.fla, 3dspaceship.fla.
Другим часто применяемым специальным эффектом Flash является моделирование небольшого трехмерного объекта. Некоторые разработчики говорят, что Flash не позволяет создавать настоящую трехмерную графику, но это не может сделать ни одна компьютерная программа поскольку компьютерные мониторы двумерные.
Вся компьютерная трехмерная графика – это всего лишь иллюзия. Хотя Flash и ActionScript не могут похвастаться большими возможностями для создания трехмерных объектов, с их помощью нетрудно создать некоторые специальные эффекты. Используя законы тригонометрии, вы можете преобразовать трехмерные координаты в двумерные на экране и смоделировать простые объекты наподобие куба.
Задача проекта
В данном разделе вы научитесь преобразовывать координаты трехмерного пространства в двумерные экранные координаты. Затем вы примените эти знания для создания простого трехмерного куба, а потом и более сложного объекта. Пользователь сможет управлять этими моделями, чтобы убедиться в том, что они действительно являются трехмерными объектами, а не простыми двумерными изображениями.
Подход
Для того чтобы понять, как используются трехмерные координаты, вам необходимо знать основы аналитической геометрии. Это один из самых трудных разделов данной книги, поэтому, если изучение математики вас не привлекает, вы можете пропустить его и перейти к следующей главе.
Подготовка ролика
В описываемых ниже примерах используются только точки и линии. Создать точку легко, однако линия должна соответствовать определенным условиям. Подробное описание приводится ниже.
Создание кода
В следующих разделах описывается пошаговое создание трехмерных моделей в Flash. Начнем с кода, преобразующего трехмерные координаты в двумерные экранные координаты.
Преобразование координат
Местоположение объектов на экране определяется двумя координатами: х и у. Объекты в трехмерном пространстве должны иметь три координаты: х, у и z. Последняя определяет глубину.
Для отображения объектов на рабочем поле необходима функция, преобразующая х, у и z в экранные координаты х и у. Кроме того, вы будете наклонять и вращать объекты. Поэтому функция преобразования должна учитывать базовые наклоны и вращение.
Учтите, что это самый сложный сценарий из тех, которые мы до сих пор рассматривали и, возможно, из всех сценариев данной книги.
Математическая функция Math.atan (arctg, арктангенс) используется для преобразования координат в угол, а функции Math.sin и Math.cos – для преобразования значения углов обратно в координаты. Таким o6разом, координаты точки преобразуются в угол и расстояние от центра плоскости. Затем точка поворачивается и вновь преобразуется в координаты. Данное действие выполняется один раз для вращения и один раз для наклона. В результате вы получите координаты х и у, которые можно использовать на экране компьютера.
Комментарии, содержащиеся в нижеприведенном коде, объясняют, какое действие выполняет каждая его часть. Затем приводятся пошаговые объяснения.
// Переводим трехмерные координаты в координаты на экране
// (делаем проекцию).
function
plotPoint(object) {
//(1)
// Берем координаты объекта.
x
=
object.x;
y
=
object.y;
z
=
object.z;
//(2)
// Вычисляем расстояние от центра.
radius
=
Math.sqrt(x
*
x
+
y
*
y);
//(3)
// Вычисляем первый угол.
if
(x
=
=
0
)
angle
=
Math.atan(
1000000
);
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
;
// Возвращаем новые координаты
return
({
x: screenx,
y: screeny,
z: screenz
});
}
Интересно, что Flash распознает понятие бесконечности. Так, выражение Math.atan(1/0) будет вычислено с результатом 1.5707963267949, то есть Pi/2!