
- •Методы использования 3d
- •Предварительная прорисовка
- •Приближенные иллюстрации
- •3D в реальном времени
- •Обзор концепций трехмерной графики
- •Вершины
- •Глубина
- •Добавление линий слияния
- •Матрицы преобразования
- •Сортировка глубины
- •Закрашивание сторон
- •Выбраковка задних поверхностей
- •Прорисовка только необходимых объектов Подсветка полигонов
- •Подсветка куба
Прорисовка только необходимых объектов Подсветка полигонов
Мы получили довольно интересный эффект вращения сплошного куба на рабочем месте, однако не рассмотрели один важный фактор, необходимый для обеспечения реальности трехмерного изображения: динамическую подсветку модели. Для создания более реалистичной среды необходимо установить источник света, который будет освещать модель и создавать тени согласно углу от источника света.
Здесь появится более сложная математика, поэтому с нее я и начну этот параграф. Перед знакомством с Flash вся моя математика после высшего учебного заведения сводилась к подсчету счетов и сумм в ресторане. Формулы, которые будут использоваться здесь, являются результатом многих ночей, проведенных за компьютером на математических сайтах, а также помощи ahab - модератора форумов на сайте www.were-here.com. Мне также помогли друзья с более глубокими знаниями математики. Я хочу попросить вас использовать все доступные источники, которые могут оказать вам помощь. Не забывайте о книгах - в них есть все нужные формулы. Невероятные эффекты Flash будут достигнуты посредством комбинирования этих ресурсов с вашей изобретательностью, а не только с помощью математических выкладок.
Подсветка куба
Сначала необходимо создать источник света. Это можно сделать с помощью переменных, однако мы применим здесь объектно-ориентированный метод и сделаем источник света отдельным объектом (мы применим эту же концепцию в следующей лекции).
Сохраните фильм в файле spinning_cube_5.fla. Сразу в начале кода, перед всей имеющейся программой, введите следующее.
LightSource = function(x, y, z, brightness) {
this.x = x;
this.y = y;
this.z = z;
his.brightness = brightness;
this.calcMag = function() {
this.magnitude = Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);
};
this.calcMag();
};
Функция-конструктор LightSource создает новый источник света для нашего мира. Единственными ее параметрами являются позиция и яркость, которые устанавливаются при создании объекта (в конечном счете вам понадобится настраивать эти параметры с помощью методов). Метод calcMag вычисляет магнитуду источника света (расстояние от центра пространства до источника). Это значение понадобится нам позже, и нам также понадобится пересчитывать его при изменении параметров x, y или z.
Чтобы создать инстанс LightSource, введите следующий код после строки focalLength = 400; (она находится сразу после секции, к которой мы создаем фильм center, рядом с началом кода).
light = new LightSource (-20000, -20000, 20000, 100);
Итак, light теперь является LightSource, который используется в сцене, и если нам понадобится получить доступ к любому из его параметров, мы будем использовать выражение light.параметр. Мы установили его позицию на -20,000 по осям x и y, и на позицию 20,000 по оси z. При таком положении источника объект будет традиционно освещен спереди, сверху и слева. Мы также установили его яркость на значение 100. Потенциальные улучшения нашего исходного объекта LightSource могут включать в себя дополнительные методы для изменения яркости или для присвоения цвета нашему источнику.
Теперь нам нужна переменная модели, которая будет содержать ее цвет. Мы могли бы просто установить цвет для всей модели целиком, однако интереснее присвоить цвет отдельно сторонам или полигонам. Давайте улучшим свойства стороны модели, после чего они будут содержать объекты с информацией о стороне, в противовес обычным ссылкам на номера вершин.
Запустив фильм, вы увидите, как по мере вращения вашего куба на него падает свет и создаются тени на гранях.
К модели вращающегося куба применена динамическая подсветка, что обеспечивает более реалистичное симулирование глубины.
ЭТрехмерные векторы (U и V), полученные из вершин (вспомните, что вектор здесь представляет собой позицию и направление в пространстве). Узнав U и V, мы находим их векторное произведение, которое в результате даст вектор, перпендикулярный двум векторам, используемым в операции. В трехмерном пространстве, этот вектор перпендикулярен к поверхности и называется нормалью полигона. Эта нормаль говорит нам об ориентации поверхности полигона.
Определив этот вектор, мы можем найти его отношение к нашему источнику света и определить, какое количество света он должен получать. Для этого использовалась следующая формула.
Заметка: U и V использовались здесь для обозначения двух векторов и не относятся к переменным U и V, использованным выше.
Что это значит? Для нахождения косинуса угла между источником света и нормалью полигона мы умножаем два вектора друг на друга (скалярное произведение, являющееся величиной расстояния между двумя векторами) и затем делим полученное число на произведение длин двух векторов (их магнитуды, или расстояние от центра пространства).