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

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

Матрицы преобразования

Теперь мы поговорим еще об одном способе реализации преобразования. При любом вращении около оси y (вы сами можете составить код для вращения вокруг двух других осей) мы обрабатываем циклом каждую вершину и соответствующим образом настраиваем координаты. Было бы неплохо осуществлять это только один раз, после вычисления всех необходимых преобразований. Это можно реализовать с помощью матриц.

Каждая вершина также может быть описана матрицей без надобности настройки какого-либо кода. Вершина с координатами (50,30,15) может быть записана в следующем виде:


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

В нашем последнем упражнении, например в функции rotateY, преобразование обеспечивалось следующим образом.

x = cos(?)*x - sin(?)*z;
//У = y;
z = cos(?)*z + sin(?)*x;

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

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


Результат умножения данной матрицы 3х3 на координатную матрицу 3х1 даст нам другую матрицу.


Это вам знакомо, не правда ли? Да, это та же формула, которая использовалась функцией rotateY, рассмотренной выше! Сейчас вам кажется, что использовать эту матрицу гораздо сложнее, нежели ее предшественницу, однако если настроить формулу один раз (что сводится к операциям умножения и сложения), вы сможете использовать ее во всех остальных преобразованиях. Вот они.

  1. Преобразование около оси x

  2. Преобразование около оси z

  3. Изменение размера объекта

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

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

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

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

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

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