Читайте также:
|
|
Плугины данного класса позволяют реализовать произвольный модификатор, который может перемещать вершины, но не изменять топологию объекта (число вершин, принадлежность вершин к ребрам и граням и т.д.) Примерами таких модификаторов могут служить такие стандартные модификаторы 3ds max, как Bend, Stretch или Taper. Их написание, как правило, требует только одного обработчика события – map. Это событие происходит всякий раз, когда модификатор применяется к объекту. Именно в нем реализуется алгоритм перемещения вершин объекта в зависимости от параметров модификатора. Пример
plugin simpleMod saddle name:"SaddleDeform" classID:#(685325,452281)
version:1
(-- Блок параметров
parameters main rollout:params
(amount type:#integer ui:amtSpin default:20
)
-- Свиток, задающий параметр
rollout params "Saddle Parameters"
(spinner amtSpin "Amount: " type:#integer range:[0,1000,20]
)
-- Вычисление перемещения вершин
on map i p do
(p.z += amount * sin((p.x * 22.5/extent.x) * (p.y * 22.5/extent.y))
p
)
)
Приведенный скрипт реализует модификатор, изгибающий объект седлом (два угла поднимаются, а два других опускаются). Лучше всего рассматривать применение этого модификатора к плоским объектам. В его свитке имеется только один параметр, определяющий степень искажения объекта. Ключевой объект данного плугина – обработчик события map, который в общем случае определяется следующим образом
on map Индекс Точка_в_3D_пространстве do
Данный обработчик вызывается для каждой точки деформируемого объекта, которая может быть вершиной сетки, сплайна, управляющей вершиной NURBS объекта и т.д. Его задача вычислить новые координаты, для каждой точки и вернуть преобразованную точку, как результат работы функции. Первый аргумент обработчика – индекс представляет собой номер точки, который не обязательно совпадает с номером вершины в сетке. Второй аргумент – собственно точка, то есть ее координаты в трехмерном пространстве. Поскольку данный обработчик события вызывается весьма часто – столько раз, сколько точек в объекте, следует, по возможности, ограничить число создаваемых им объектов. Если Вам нужны локальные переменные, то лучше объявить их не в обработчике, а в определении плугина, что позволит избежать лишней работы с динамической памятью. Не следует так же пытаться получить доступ к модифицируемому объекту из обработчика map. Это может привести к тому, что модификация начнет рассчитываться внутри обработчика, а в результате образуется бесконечный цикл.
В обработчике map можно пользоваться предопределенными локальными переменными, содержащими данные о габаритном контейнере модификатора
min – Точка в 3D пространстве, содержащая минимальные координаты
габаритного контейнера
max – Точка в 3D пространстве, содержащая максимальные координаты
габаритного контейнера
center – Точка в 3D пространстве, содержащая координаты центра
габаритного контейнера
extent – Точка в 3D пространстве, содержащая размеры габаритного
контейнера
Последняя переменная, extent, как раз и используется в приведенном выше примере.
Можно так же ограничить применение модификатора некоторым диапазоном, как это делается, например, для модификатора Bend. Для этого следует написать три обработчика специальных событий. Первые два
on modLimitZMin do
on modLimitZMax do
должны возвращать вещественное число, которое означает соответственно минимальное и максимальное значение координаты, для которых модификатор будет применяться. Выбор координаты осуществляется с помощью обработчика
on modLimitAxis do
который должен возвращать одно из значений #x, #y или #z. При этом указанные в двух предыдущих обработчиках значения будут ограничивать применение модификатора по соответствующим осям. Простейший способ определения этих обработчиков – использовать значения заданные с помощью компонент интерфейса.
Дата добавления: 2015-10-31; просмотров: 62 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Скрипт плугины класса SimpleObject | | | Скрипт плугины класса RenderEffect |