Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3401 / 339 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 11:

Реализация 3D-графики с помощью рисования API

  1. Сейчас мы разберем, что происходит в этом коде. Запустив фильм, вы увидите, как по мере вращения вашего куба на него падает свет и создаются тени на гранях.



    К модели вращающегося куба применена динамическая подсветка, что обеспечивает более реалистичное симулирование глубины.

    Давайте сделаем шаг назад и разберемся в последней части кода. U и V - это просто трехмерные векторы, полученные из вершин (вспомните, что вектор здесь представляет собой позицию и направление в пространстве). Вы, вероятно, проделывали аналогичные вещи не один раз для двухмерных векторов в фильмах Flash, при вычитании параметра _x одного фильма из параметра _x другого (единственное отличие здесь в том, что у нас есть еще одно измерение, для которого также необходимо выполнять расчет). Узнав U и V, мы находим их векторное произведение, которое в результате даст вектор, перпендикулярный двум векторам, используемым в операции. В трехмерном пространстве, этот вектор перпендикулярен к поверхности и называется нормалью полигона. Эта нормаль говорит нам об ориентации поверхности полигона.


    Определив этот вектор, мы можем найти его отношение к нашему источнику света и определить, какое количество света он должен получать. Для этого использовалась следующая формула.


    Заметка: U и V использовались здесь для обозначения двух векторов и не относятся к переменным U и V, использованным выше.

    Что это значит? Для нахождения косинуса угла между источником света и нормалью полигона мы умножаем два вектора друг на друга (скалярное произведение, являющееся величиной расстояния между двумя векторами) и затем делим полученное число на произведение длин двух векторов (их магнитуды, или расстояние от центра пространства).

    Некоторые очень умные и знаменитые математики работали очень долго над этой формулой, и кто я такой, чтобы обсуждать ее? Я могу использовать эту формулу для нахождения угла, под которым свет падает на полигон, и это все, что мне необходимо.

    Перед тем, как мы перейдем к коду, использующему эту формулу, необходимо понять природу источника света, который мы разместили в нашей трехмерной сцене. В 3D-программах источник света сродни направленному свету, всегда направленному на точку в центре пространства. Это избавляет нас от необходимости ориентировать наш свет на модели при его первом размещении или при его изменении в процессе анимации. Однако, по этой причине, если свет перемещается на центр пространства, он не может быть направлен ни на одну из моделей, поэтому они будут черными и неосвещенными (черными, так как у нас не установлен источник рассеянного света в сцене; вы сможете установить этот источник позже).

    Остались три последние строки функции. magP является магнитудой для нашей нормали, которая является расстоянием полигона от центра пространства (здесь работает теорема Пифагора). dP содержит результат операции скалярного произведения - умножения и сложения двух компонентов вектора. Наконец, мы определяем угол нахождением арккосинуса нашего скалярного произведения деленного на магнитуды двух векторов. Это даст нам значение в радианах между нулем и пи, поэтому мы делим на пи, чтобы получить процентное значение. Мы используем это для нахождения процента яркости нашего источника света (делим на 100 еще раз из-за способа, который используется для установки яркости света - я хотел использовать целые числа для представления этого значения, поэтому нужно разделить на 100 для возвращения процентной величины этой функцией).

    Можете вздохнуть с облегчением - мы закончили упражнение. Однако, если вы хотите вернуться к какой-либо части этого упражнения (или к одной из ранних версий вращающегося куба), все исходные файлы FLA с комментариями находятся на компакт-диске. Вы можете сравнить их с созданными вами файлами, если возникнут какие-либо вопросы.

    В файле spinning_cube_final.fla я добавил текстовые поля, поэтому вы можете изменять преобразования куба и параметры света в режиме run-time. Я также добавил функцию translate, чтобы ваши модели могли двигаться от центра. В идеале, вам нужно применять этот способ (я сделал это на свой страх и риск). Одним из альтернативных методов является использование матрицы размером 4х4 для наших преобразований и добавление четвертого измерения для каждой вершины. Мы изучим это в следующей лекции. Это одно из улучшений, которое я вам советую сделать, если вы решили продолжить работу с этим фильмом.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?