Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MAXScript help rus.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.24 Mб
Скачать

Внесение изменений в плугин

MAXScript позволяет вносить изменения в плугин во время работы 3ds max. При этом объекты текущей или вновь загруженной сцены, созданные плугином предыдущих версий автоматически дополняются до новой. Делается это с помощью простого сравнения имен локальных переменных, блоков параметров и самих параметров. При этом локальные переменные и параметры с совпадающими переменными сохраняются, вновь созданные заполняются значениями по умолчанию, а удаленные отбрасываются. Имеются, однако, следующие ограничения

  • Параметры, принадлежащие объекту класса, не могут объявляться параметрами, принадлежащими классу. Иными словами, нельзя менять значение type в определении параметра.

  • Параметры не могут менять тип

  • Параметры не могут перемещаться из одного блока в другой

Следует учитывать, что такой механизм работает только для тех плугинов, в определении которых явно задан параметр classID.

Вы можете взять управление процессом доработки объекта до новой версии в свои руки. Для этого надо определить обработчик события update, которое происходит, если загружается объект, созданных одной из предыдущих версий плугина. В этом случае может пригодиться значение локальной переменной version, которая содержит номер версии плугина, создавшего объект. Например

plugin name: “Some Object” classID: #(786543,345678) version: 3

( …

on update do

( if version = = 1 then … -- Доработка объекта первой версии

if version = = 2 then … - Доработка объекта второй версии

)

)

После доработки переменная version будет содержать уже значение новой версии. Однако подобные меры надо предпринимать только в том случае, если необходимы специальные операции по переводу объектов из старой версии в новую. В большинстве случаев вполне достаточно автоматически выполняемых MAXScript действий. Если же Вы заведомо не собираетесь работать с файлами, содержащими объекты предыдущих версий Вашего плугина, то не следует усложнять программу излишними действиями.

Срипт плугины класса Geometry

Скрипт плугины этого класса требуют наличия метода create, если они не являются временными, невидимыми, или не расширяют другие плугины.

Пример

plugin geometry rowbar_plugin_def name:"RowBar"

category:"Scripted Primitives"

( local boxes, clickAt

-- Свиток параметров с единственным задатчиком, который задает

-- расстояние между box-ами

rollout dist "Parameters"

( spinner dist "Distance" range:[-1000,1000,20]

)

-- Средство создания объектов

tool create

( on mousePoint click do

( clickAt = worldPoint

boxes = for i in 1 to 10 collect box pos:([dist.dist.value*i,0,0] + clickAt)

#stop

)

)

)

В результате выполнения приведенного плугина создается кнопка на панели Create. После нажатия кнопки мыши в видовом окне, в указанном месте создается колонка из 10 примитивов box. Это простейший вид плугина, который не имеет дело со специфическими объектами, или с сохраняемыми параметрами.

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

Пример

plugin geometry Cuboid name:"Cuboid" classID:#(0x133067, 0x54374)

category:"Scripted Primitives" extends:Box

( -- Локальная функция для определения максимума из двух чисел

fn fmax val1 val2 = if val1 > val2 then val1 else val2

-- Средство создания объекта

tool create

( on mousePoint click do

case click of

( 1: nodeTM.translation = gridPoint

2: #stop

)

on mouseMove click do

if click == 2 then delegate.width = delegate.length =

delegate.height = 2 * fmax (abs gridDist.x) (abs gridDist.y)

)

)

Скрипт плугины класса SimpleObject

SimpleObject представляет собой графический примитив, базирующийся на треугольной сетке. Примерами таких примитивов могут служить сферы, параллелепипеды, конусы, одним словом все стандартные и улучшенные примитивы 3ds max. При написании плугина такого класса необходимо включить в него обработчик события buildMesh, происходящего при создании или настройке параметров объекта. Все действия по трассировке лучей, проверке столкновений, применению модификаторов к созданному объекту и т.д. будут производиться автоматически и программной поддержки с Вашей стороны не требуют.

В плугинах класса simpleObject обязательно наличие средства create.

Доступ к сетке объекта, который будет создан с помощью Вашего плугина, осуществляется с помощью предопределенной локальной переменной mesh. Данная переменная доступна в любом месте определения плугина, но чаще всего используется в обработчике события buildMesh. Вы можете корректировать ее или присвоить ей значение вновь созданной сетки. При этом допускается использование любых средств работы с сетками, которые будут рассматриваться далее.

Пример

--Плугин для создания примитивного подобия башни

plugin simpleObject tower_plugin_def name:"Tower"

classID:#(145345,543211) category:"Scripted Primitives"

( -- Блок параметров башни: Высота, ширина и глубина

parameters main rollout:params

( height type:#worldUnits ui:height default:0

width type:#worldUnits ui:width default:0

depth type:#worldUnits ui:depth default:0

)

-- Свиток для ввода и настройки параметров башни

rollout params "Two Faces Parameters"

( spinner height "Height" type:#worldunits range:[-1000,1000,0]

spinner width "Width" type:#worldunits range:[-1000,1000,0]

spinner depth "Depth" type:#worldunits range:[-1000,1000,0]

)

-- Обработчик события создания и настройки параметров башни

on buildMesh do

( -- Метод setMesh определяет конфигурацию сетки. В данном случае

-- создается грань основания башни

setMesh mesh \

verts:#([0,0,0],[width,0,0],[width,depth,0],[0,depth,0]) \

faces:#([3,2,1], [1,4,3])

-- затем созданная грань выдавливается два раза

extrudeFace mesh #(1,2) (height * 0.5) 40 dir:#common

extrudeFace mesh #(1,2) (height * 0.5) 50 dir:#common

)

-- Средство создания объекта с помощью мыши

tool create

( on mousePoint click do

case click of

( 1: nodeTM.translation = gridPoint

3: #stop

)

on mouseMove click do

case click of

( 2: (width = gridDist.x; depth = gridDist.y)

3: height = -gridDist.z

)

)

)

В этом примере определяется новый примитив, называемый Tower, который представляет собой примитивное подобие башни. Первое перемещение мыши, при нажатой кнопке, определяет размеры ее основания. Перемещение до второго нажатия левой кнопки задает высоту башни. Описанный в плугине свиток содержит задатчики трех анимируемых параметров: высоты, ширины и глубины. Ключевыми компонентами плугина являются средство create и обработчик события buildMesh. Create задает габариты объекта, а buildMesh приводит положение вершин в соответствие с заданными параметрами.

Внутри средства create так же определяется точка положения основания объекта, для чего применяется локальная переменная nodeTM.

В плугинах этого класса могут определяться так же обработчики следующих трех событий.

on OKtoDisplay do

Обработчик данного события должен возвращать логическое значение, либо true либо false. В случае false построенная сетка не будет отображаться в видовом окне. Данный прием используется в том случае, если некоторое значение параметров объекта приводит к невозможности корректно отобразить его. По умолчанию это значение всегда true.

Обработчик второго события

on hasUVW do

так же должен быть функцией возвращающей логическое значение. Оно равно true, если координаты вершин сетки содержат текстурные координаты и false в противном случае. Для многих стандартных примитивов в свитке параметров имеется флажок Generate Mapping Coords. Хорошим решением будет, если обработчик события hasUVW возвращает значение этого флажка.

Третье событие

on setGenUVW Параметр do

происходит при рендеринге объекта, которому назначен материал с текстурой, а данных о текстурных координатах у вершин нет. Параметр имеет логическое значение и указывает, нужны ли для рендеринга текстурные координаты, или наоборот, они лишние. Например, если в Вашем плугине имеется функция GenMappingCoords, которая генерирует текстурные координаты, то обработчик данного события может иметь такой вид

on SetGenUVW onOff do

( if onOff then GenMappingCoords ( )

)

А вот пример другого плугина, который создает трубу с квадратным сечением. Для этого создаются два временных объекта – параллелепипеда. Больший из них служит основанием для трубы, а второй вырезает в нем отверстие с помощью логического вычитания. Для их создания используется функция CreateInstance, которая создает объекты так, что они не являются элементами сцены.

plugin simpleObject squareTube name:"SquareTube"

classID:#(63445,55332) category:"Scripted Primitives"

( local box1, box2

-- Блок параметров - ширина и длина основания, и высота трубы

parameters main rollout:params

( length type:#worldUnits ui:length default:1E-3

width type:#worldUnits ui:width default:1E-3

height type:#worldUnits ui:height default:1E-3

)

-- Свиток отображающий параметры объекта

rollout params "SquareTube"

( spinner height "Height" type:#worldUnits range:[1E-3,1E9,1E-3]

spinner width "Width" type:#worldUnits range:[1E-3,1E9,1E-3]

spinner length "Length" type:#worldUnits range:[-1E9,1E9,1E-3]

)

-- Обработчик события построения сетки

on buildMesh do

( if box1 == undefined then

(box1 = createInstance box; box2 = createInstance box)

box1.height = height; box2.height = height

box1.width = width; box2.width = width * 2

box1.length = length; box2.length = length * 2

mesh = box2.mesh - box1.mesh

)

-- Средство задание параметров объекта с помощью мыши

tool create

( on mousePoint click do

case click of

( 1: nodeTM.translation = gridPoint

3: #stop

)

on mouseMove click do

case click of

( 2: (width = abs gridDist.x; length = abs gridDist.y)

3: height = gridDist.z

)

)

)

Скрипт плугины класса Shape

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

Пример

-- Плугин создает прямоугольник с закругленными углами

plugin shape Extended_Rect name:"Rectangle2"

classID:#(0x133067, 0x54375) extends:rectangle version:1

category:"Splines"

( -- Воспомогательная функция, определяющая наибольшее

-- из двух чисел

fn fmax val1 val2 = if val1 > val2 then val1 else val2

-- Средство создания прямоугольника

tool create

( local startPoint

on mousePoint click do

case click of

( 1: startPoint = nodeTM.translation = gridPoint

3: #stop

)

on mouseMove click do

case click of

( 2: ( delegate.width= abs gridDist.x

delegate.length= abs gridDist.y

nodeTM.translation = startpoint + gridDist/2.

)

3: delegate.corner_radius = fmax 0 -gridDist.x

)

)

)

Скрипт плугины класса Light

Плугины этого класса могут только расширять свойства существующих плугинов, создающих источники света. Если в нем определено средство create, оно заменяет существующее. В настоящее время нет возможности расширять свойства направленных источников света. Пример плугина этого класса был приведен в главе о функциях, используемых при разработке плугинов.

Скрипт плугины класса Helper

Плугины этого класса могут только расширять свойства существующих плугинов, создающих объекты-помощники. Если в нем определено средство create, оно заменяет существующее. Пример плугина этого класса был приведен в главе о функциях, используемых при разработке плугинов.

Плугины класса Modifier

Плугины этого класса могут только расширять свойства уже существующих модификаторов. Панель Modify автоматически создает новый экземпляр модификатора, когда он появляется в списке More или как кнопка на свитке Modifiers. Никакого специального управления событием create не требуется

Пример

-- Данный плугин является упрощением модификатора изгиба

plugin modifier myMod name:"New Midifier"

classID:#(685325,452281) extends:Bend replaceUI:true version:1

( -- Параметр: угол изгиба

parameters main rollout:params

( bendamt type:#float animatable:true ui:bendamt default:0.0

on bendamt set val do delegate.angle = val

)

-- Свиток для управления углом изгиба

rollout params "Bend Parameters"

( spinner bendamt "Bendiness: "

)

)

Пример

-- Данный плугин делает то же самое, что модификатор

-- Normalize Spline

plugin modifier NSpline name:"Normal. Spline"

classID:#(0x133067, 0x54374) extends:normalize_spline

replaceUI:true version:1

( -- Параметр: Длина звена

parameters main rollout:params

( seglen type:#float animatable:true ui:seglen default:20

on seglen set val do delegate.length = val

)

-- Свиток для ввода длины звена

rollout params "Parameters"

( spinner seglen "Seg Length: " range:[0.01,1e9,20]

)

)

Скрипт плугины класса SimpleMod

Плугины данного класса позволяют реализовать произвольный модификатор, который может перемещать вершины, но не изменять топологию объекта (число вершин, принадлежность вершин к ребрам и граням и т.д.) Примерами таких модификаторов могут служить такие стандартные модификаторы 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. При этом указанные в двух предыдущих обработчиках значения будут ограничивать применение модификатора по соответствующим осям. Простейший способ определения этих обработчиков – использовать значения заданные с помощью компонент интерфейса.

Скрипт плугины класса Material

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

Пример

-- Этот плугин заменяет стандартный интерфейс редактора материалов

-- на свиток с двумя задатчиками и кнопкой выбора цвета.

-- Полученный с его помощью материал имитирует свойства стекла

plugin material myGlass name:"Supa Glass" classID:#(695425,446581)

extends:Standard replaceUI:true version:1

( -- Блок параметров

parameters main rollout:params

( trans type:#float default:27 ui:trans -- Прозрачность

refrac type:#float default:1.5 ui:refrac -- Коэффициент преломления

col type:#color default:blue ui:col -- Цвет стекла

-- Присвоение свойств объекту делегату

on trans set val do delegate.opacity = val

on refrac set val do delegate.ior = val

on col set val do delegate.diffuse_color = val

)

-- Свиток определяющий параметры нового материала

rollout params "Glass Parameters"

( -- Задатчик прозрачности

spinner trans "Transparency: " fieldwidth:45 offset:[-90,0]

-- Задатчик коэффициента преломления

spinner refrac "Index of Refraction: " fieldwidth:45 offset:[-90,0]

-- Кнопка выбора цвета

colorpicker col "Base color: " align:#center

)

-- Обработчик создания объекта

on create do

( -- Определение параметра opacityFalloff объекта делегата

delegate.opacityFalloff = 75

)

)

Скрипт плугины класса TextureMap

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

Скрипт плугины класса RenderEffect

Ключевую роль при написании этих плугинов обычно играет обработчик события apply или preApply. После объявления, описанный эффект доступен через диалог Render Effects > Add

Событие apply генерируется применением написанного Вами фильтра к результату рендеринга

on apply Параметр do

Когда написанный Вами эффект добавлен к списку эффектов и нажата кнопка Update Scene или Update Effect, обработчик события apply получает управление. В качестве параметра ему передается готовая битовая карта – результат рендеринга, со всеми эффектами, которые находятся в списке перед Вашим. В этом месте программы можно отредактировать полученное изображение (обычно при этом используются функции getPixel ( ) и setPixel ( )). Полученное в результате изображение переходит для обработки к следующим эффектам.

Чтобы написанный Вами эффект мог использовать данные канала g-буфера, необходимо определить обработчик события

on channelsRequired do

Этот обработчик должен возвращать массив имен каналов g-буфера. Допускаются следующие имена.

#zDepth

#matID

#objectID

#UVCoords

#normal

#unClamped

#coverage

#node

#shaderColor

#shaderTransparency

#velocity

#weight

Имеется еще одно событие, которое может понадобиться Вам при написании плугинов данного класса.

on preApply Параметр do

Его обработчик позволяет Вам анализировать результат рендеринга до применения к нему эффекта делегата. В приведенном ниже примере обработчик channelsRequired определяет необходимость в каналах #node и #coverage, а preApply использует информацию канала #node в качестве маски для эффекта делегата, что позволяет ограничить эффект пределами одного объекта сцены.

При разработке эффектов следует учитывать, что нельзя использовать в обработчике их событий функцию render, так как это приведет к зацикливанию программы.

Пример:

-- Данный эффект расширяет свойства эффекта Blur, позволяя

-- ограничить область действия эффекта пределами выбранного

-- объекта сцены.

plugin RenderEffect myBlurFX name:"Super Blur FX" classID:#(6545,456581)

extends:Blur version:1

( -- Локальные переменные

local tx = bitmaptexture()

local cm

local g_channels = #(#node, #coverage)

-- Свиток для дополнительных параметров эффекта

-- (Выбор объекта, к которому применяется фильтр)

rollout params "Super Blur FX Parameters"

( label nn align:#center

pickbutton nodepick "Pick Node"

)

-- Блок параметров

parameters main rollout:params

( thenode type:#node ui:nodepick

on thenode set nd do

params.nn.text = if nd = = undefined then "" else nd.name

)

-- Определение используемых каналов g-буфера

on channelsRequired do g_channels

-- Получение маски для применения фильтра

on preApply map do if theNode != undefined then

( if cm = = undefined then

( cm = getChannelAsMask map #node node:theNode \

fileName:(scriptsPath + "__fxtmp.bmp")

save cm

tx.bitmap = cm

)

else

getChannelAsMask map #node node:theNode to:cm

)

-- Определение маски фильтра

on create do

( delegate.selMaskActive = true

delegate.selImageActive = false

delegate.selMaskMap = tx

)

)

Пример

-- Данный скрипт упрощает фильтр цветового баланса, позволяя

-- регулировать только красный цвет

plugin renderEffect myColorBalanceFx name:"Super Color Balance FX"

classID:#(64425,45761) extends:Color_Balance version:1

replaceUI:true

( -- Блок параметров

parameters main rollout:params

( redness type:#integer animatable:true ui:redness default:0.0

on redness set val do delegate.red = val

)

-- Свиток

rollout params "Super Color Balance Parameters"

( spinner redness "Redness: " type:#integer range:[-100,100,0]

)

)

Пример

-- Данный скрипт позволяет формировать изображение,

-- напоминающее негатив

plugin renderEffect Negative name:"Negative"

classID:#(0xb7aa794c, 0xc3bd78ab)

( -- Блок параметров содержит обращаемый цвет

parameters main rollout:params

( Color type:#color default:blue ui:Color

)

-- Свиток, в котором определен компонент выбора цвета

rollout params "Negative Parameters"

( colorpicker Color "Base color: " align:#center

)

-- Обращение цвета пересмотром всех точек

on apply bmp do

( for h = 0 to (bmp.height-1) do

( local sline = getPixels bmp [0,h] bmp.width

for i = 1 to sline.count do sline[i] = Color - sline[i]

setPixels bmp [0,h] sline

)

)

)

Скрипт плугины класса Atmospheric

Скрипт плугины этого класса могут только расширять свойства имеющихся плугинов.

Пример

-- Данный плугин позволяет упростить задание параметров тумана.

-- Предоставляется возможность выбора только цвета

plugin atmospheric myFogEnv name:"Super Fog Env"

classID:#(64433,27761) extends:Fog version:1 replaceUI:true

( -- Блок параметров. В нем только один параметр – цвет тумана

parameters main rollout:params

( fogcol type:#color animatable:true ui:col

-- При выборе цвета соответствующее значение присваивается

-- параметру объекта делегата

on fogcol set val do delegate.fog_color = val

)

-- Свиток, замещающий свитки обычного тумана

rollout params "Super Fog Parameters"

( colorpicker col "Fog Color"

)

-- Обработчик создания объекта, определяет тип тумана

on create do delegate.fog_type = 1

)

Объекты 3ds max

Как уже упоминалось, все объекты, с которыми работает MAXScript, ведут свое происхождение от абстрактного класса Value. Одним из наиболее важных его потомков является так же абстрактный класс MaxWrapper, который, как и следует из его названия, содержит в себе все объекты Max. Все объекты, которые Вы создаете с помощью стандартных средств 3ds max, такие как объекты сцены, модификаторы, материалы, эффекты и т.д. являются его прямыми потомками и, следовательно, наследуют его свойства. Для начала рассмотрим ряд функций, которые предназначены для просмотра или программного доступа к спискам свойств, классов или объектов.

apropos

Данная функция используется для просмотра списка переменных по образцу названия и класса. Полное обращение к ней выглядит так

apropos Символьная_строка to:Поток

Второй параметр необязателен и определяет поток, в который осуществляется вывод. По умолчанию это окно интерпретатора MAXScript. Первый параметр, задаваемый символьной строкой, позволяет задать образец для фильтрации переменных по их имени и, через двоеточие по типу. Например

apropos “a*:float”

выведет в окно MAXScript список переменных, начинающихся на букву “a” и содержащих данные типа float.

showClass

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

showClass Символьная_строка to:Поток

Второй параметр, как и для функции apropos, не обязателен и означает поток, в который будут выводиться результаты работы. Символьная строка, указываемая в первом параметре, имеет несколько более сложную, чем в первом случае, структуру. В ней могут быть три части

Имя_класса . Имя_свойства : Имя_класса_предка

Например, чтобы получить данные обо всех классах потомках класса Point3Controller, следует указать

showClass “*:Point3Controller”

а чтобы узнать все свойства класса box, можно выполнить следующий скрипт

showClass “box.*”

Естественно вместо имен класса, свойства и класса предка можно задавать шаблоны с символами *, например скрипт

showClass “b*:p*”

перечислит Вам все классы, имена которых начинаются на “b”, классы предки которых начинаются на “p

При использовании этой функции следует учитывать следующее обстоятельство. Если Вы не указали имени класса предка, то вывод будет осуществляться для всех классов предков, а если не указано свойство, то будут выводиться только названия классов, без свойств.

showProperties

Посмотреть свойства конкретного объекта можно с помощью этой функции. В общем случае она имеет три параметра

showProperties MAXWrapper_объект Символьная_строка to:Поток

Второй и третий параметры необязательны. Третий, как обычно, задает поток, в который будут выводиться результаты. Второй параметр задает шаблон для свойств. Например, если Вам нужны имена свойств, начинающихся на букву “a”, то в качестве второго параметра можно задать строку “a*”. А вот первым параметром может быть задан любой объект, класс которого происходит от MAXWrapper. Например, такой скрипт

s = Sphere( )

showProperties s

выведет в окно интерпретатора MAXScript все свойства сферы, что можно было бы сделать и таким образом

showClass “sphere.*”

getPropNames

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

getPropNames MAXWrapper_объект

Функция возвращает массив, содержащий имена свойств указанного объекта. Например, чтобы получить имена свойств сферы S, необходимо записать следующий скрипт

getPropNames S

Результатом будет такой массив

#(#smooth, #radius, #mapCoords, #segs, #slice, #hemisphere, #sliceFrom,

#sliceTo, #chop, #recenter)

Как нетрудно убедиться, в нем действительно перечислены все свойства объекта сферы.

Общие свойства класса MaxWrapper

Любой объект, класс которого ведет свое происхождение от MaxWrapper, наследует от него следующие свойства

MaxWrapper_объект.category

с помощью обращения к этому свойству можно получить имя категории объекта. Например, для сферы это свойство содержит имя #Standard_Primitives, а для лофт-объекта – #Compound_Objects. Для модификаторов имена категорий имеют вид #MAX_STANDARD, #MAX_EDIT, или #MAX_SURFACE, для текстур #2D, #3D или #COMP и т.д.

Как уже упоминалось в главе о скрипт-плугинах, каждый класс объектов имеет уникальный идентификатор. Получить этот идентификатор для конкретного объекта можно с помощью свойства

MaxWrapper_объект.classID

Например, у любой сферы это свойство содержит значение #(17, 0).

Наследники класса MaxWrapper получают от него не только свойства, но и методы. Наиболее часто применяется неоднократно упоминаемый раньше метод copy. Он был довольно подробно рассмотрен, поэтому перейдем к методу

exprForMaxObject MaxWrapper_объект

этот метод возвращает полное имя объекта в виде текстовой строки. Для примера рассмотрим следующий скрипт

b1 = box ( )

exprForMaxObject b1

последний оператор вернет Вам текстовую строку “$Box01”, то есть имя объекта, созданного первым оператором. Усложним задачу, создав модификатор изгиба

bm = Bend ( )

скрипт

exprForMaxObject bm

вернет значение "unknown". Дело в том, что сам по себе модификатор не является элементом сцены, а следовательно, не имеет имени. Положение в корне изменится, когда мы применим модификатор к ранее созданному объекту

addmodifier b1 bm

exprForMaxObject bm

Теперь модификатор имеет имя "$Box01.modifiers[#Bend]"

Довольно часто при написании скрипт-плугинов, создающих сетчатые объекты, применяется следующий прием. Создается стандартный объект, а затем из его сетки делается то, что нам нужно. В этом случае может помочь функция

createInstance Класс

В качестве первого параметра ему передается название класса объекта. Например

s = createInstance Sphere

В результате в переменной s будет храниться сфера, но не как элемент сцены, то есть в видовых окнах ее видно не будет. Получившаяся сфера будет иметь радиус, количество сегментов, сетку и т.д., но не будет иметь координат центра и вообще матрицы трансформации. Параметры создаваемого объекта можно задавать после указания класса. Например, с помощью скрипта

b = createInstance Box length:10 height:40 width:20

создается параллелепипед с заданными значениями длинны, высоты и ширины.

Рассмотрим так же еще одну полезную функцию, работающую с потомками класса MaxWrapper

refs.dependents MaxWrapper_объект

Результатом этой функции будет массив объектов, которые ссылаются на указанный. Например, создадим сферу, а затем назначим ей стандартный материал

s = sphere ( )

m = standard ( )

s.material = m

после этого скрипт

refs.dependents m

выдаст следующий результат: #( $Sphere:Sphere01 @ [0.000000,0.000000,0.000000] ). Тем самым демонстрируется, что на материал m ссылается сфера Sphere01. Если бы тот же материал был назначен и другим объектам, то имена этих объектов так же оказались бы в выходном массиве.

Еще одним полезным свойством объектов, потомков MaxWrapper, является возможность ассоциировать с любым объектом произвольную информацию. Эта информация сохраняется в файле сцены и восстанавливается при его загрузке. Создать ее можно с помощью функции

setAppData MaxWrapper_объект Целое_число Символьная_строка

Первый параметр указывает объект, к которому присоединяются данные, второй параметр – уникальный идентификатор для этих данных. С помощью этого параметра одному объекту можно поставить в соответствие несколько наборов данных. Третий параметр – символьная строка, содержащая сами данные. Присоединенные данные можно получить с помощью функции

getAppData MaxWrapper_объект Целое_число

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

deleteAppData MaxWrapper_объект Целое_число

которая удалит данные, соответствующие указанному объекту и идентификатору. Если надо удалить данные для некого объекта, но для всех идентификаторов, то для этого используется функция

clearAllAppData MaxWrapper_объект

Класс Node

Этот класс, будучи опять-таки абстрактным, является потомком класса MAXWrapper. От него происходят классы, объекты которых могут быть узлами иерархий объектов. Например, НЕ являются его потомками материалы, контроллеры, текстуры и т.д. А вот геометрические примитивы, источники света, камеры – суть потомки класса Node.

Общие свойства и методы потомков класса Node

Свойства

Потомки класса Node наследуют следующие свойства

Node_объект.name

Имя объекта, возвращается в виде символьной строки.

Node_объект.baseObject

Данное свойство возвращает тип базового класса объекта, и может быть использовано только для чтения. К примеру, если создать окружность (тип Circle), а затем подвергнуть ее выдавливанию (extrude), то в результате получится объект типа EditableMesh. Тем не менее, информация об исходном типе объекта сохраняется, и ее можно получить с помощью свойства baseObject. Конкретно в этом случае в свойстве будет храниться Circle.

Node_объект.material

С помощью этого свойства можно получить или наоборот записать материал, из которого состоит объект.

Для работы с иерархиями объектов предназначены свойства

Node_объект.parent

и

Node_объект.children

Первое из них содержит ссылку на объект предок, второе на потомок. Если объект не является членом иерархии, то оба этих свойства содержат значение undefined. Если использовать свойство parent для записи, то можно переводить объект из одной иерархии в другую, или вовсе выводить из иерархии, присваивая значение undefined. Свойство children содержит не один элемент, а массив типа ChildrenArray, описанный ранее. Для того чтобы добавить или удалить элемент из этого массива, необходимо использовать специально предназначенные для этого функции append и deleteItem.

Сетка объекта, который преобразуется к типу EditableMesh, может быть получена с помощью свойства

Node_объект.mesh

Это свойство является некоторым исключением, его наследуют не все потомки класса Node. Попытка получить сетку для, например, камеры приведет к ошибке. Сетка имеет тот вид, который получается после применения всех модификаторов, но до искажений пространства.

Следующие свойства используются при работе с контроллером LookAt. Свойство

Node_объект.isTarget

Содержит логическое значение, true – если объект является целевым для другого и false в противном случае. Получить ссылку на объект, который “смотрит” на заданный, можно с помощью свойства

Node_объект.lookAt

Если же надо произвести обратное действие, то есть получить или установить объект, который является целевым для заданного, то для этого можно применить свойство

Node_объект.target

Наконец расстояние между целью и “смотрящим” объектом содержится в свойстве

Node_объект.targetDistance

и может как читаться, так и записываться.

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

Node_объект.isSelected

содержит значение true или false, в зависимости от того, выбран объект или нет. Может использоваться как для чтения, так и для записи.

Node_объект.is Hidden

True – объект скрыт, false – виден. Если категория объектов, к которой принадлежит объект, помечена, как невидимая в свитке Hide by Category на панели Display, или объект заморожен, а на панели Display включен флажок Hide Frozen Objects, то попытка изменить это свойство не приведет ни к какому результату.

Node_объект.xray

True – объект изображается в полупрозрачном виде, false – нет.

Node_объект.ignoreExtents

Если это свойство содержит true, то при нажатии кнопок Zoom Extents и Zoom Extents All размеры данного объекта не учитываются.

Node_объект.boxMode

True – объект изображается в виде габаритного контейнера, false – в обычном виде.

Node_объект.allEdges

True – в видовых окнах отображаются все грани объекта, false – только границы полигонов.

Node_объект.backFaceCull

True – изображаются обе стороны граней, false – видимость грани определяется направлением нормали.

Node_объект.wireColor

Тип данного свойства Color. В нем содержится цвет, которым объект изображается, если выводится в каркасном режиме.

Node_объект.showLinks

True – иерархические связи выводятся в окнах, false – нет.

Node_объект.showLinksOnly

True – для данного объекта выводятся только его иерархические связи.

Node_объект.isFrozen

True – объект заморожен, false – нет.

Node_объект.showTrajectory

True – траектория движения объекта выводится на экран, false – нет.

Node_объект.showVertexColor

True – при выводе объекта в полутоновом режиме будет учитываться эффект окрашивания вершин, false – нет.

Node_объект.showVertexColor

True – при выводе в окнах с полутоновым режимом учитывается цвет, назначенный вершинам, false – вывод идет обычным образом.

Node_объект.vertexColorsShaded

True – если предыдущее свойство имеет значение true, то объект выводится с полутоновой закраской. False – объект выводится со сплошной закраской.

Node_объект.isDependent

Свойство только для чтения. Возвращает true, если для объекта установлен флаг зависимости. Этот флаг может быть установлен только тогда, когда открыта панель Modify, а кроме того, в меню Views помечен пункт Show Dependencies. В этом случае флаг зависимости устанавливается для всех объектов, зависящих от модифицируемого объекта или выбранного в стеке модификатора.

Рендеринг объекта управляется следующими свойствами

Node_объект.castShadows

Тип – логический. Свойство указывает, будет объект отбрасывать тени, или нет.

Node_объект.receiveShadows

Тип так же логический. Как легко понять из названия, указывает, будут ли на объект падать тени от других объектов.

Node_объект.gbufferChannel

Целое число, определяющее идентификатор объекта для канала Object ID g-буфера.

Node_объект.visibility

Данное свойство не вещественное, как можно предположить, а логическое. При его установке в false значение visibility в окне диалога Object Properties устанавливается в 0, а если назначить ему значение true, то visibility станет равным 1. Данное свойство может анимироваться.

Node_объект.inheritVisibility

True – объект наследует свойства видимости от предков, false – нет.

Node_объект.renderable

Определяет, рендерится объект (true) или нет (false)

Node_объект.renderOccluded

Тип – логический. Изменение данного свойства влияет только на данные g-буфера. и предназначено для работы со спецэффектами.

Node_объект.motionBlurOn

True – размытие движения для объекта возможно, false – нет.

Node_объект.motionBlurOnController

Тип – контроллер. Содержит контроллер анимации предыдущего свойства.

Node_объект.motionBlur

Может принимать значения #none, #object или #image, в зависимости от типа размытия движения. Для совместимости с предыдущими версиями 3ds max может принимать значения true или false.

Node_объект.imageMotionBlurMultiplier

Вещественное значение, определяющее длину полосы размытия. Свойства

Node_объект.rcvcaustics

Node_объект.generatecaustics

Node_объект.rcvGlobalIllum

Node_объект.rcvGenerateGlobalIllum

Предназначены для работы с глобальным освещением и каустикой, и стандартными средствами 3ds max не поддерживаются.

Свойства, определяющие местоположение, ориентацию и масштаб объекта

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

Node_Объект.transform

Матрица 4х3 (описание класса Matrix3 см. ранее), которая полностью описывает масштаб, а так же положение и ориентацию объекта в пространстве. Свойство доступно как для чтения, так и для записи.

Node_Объект.pos

Может быть использован так же и синоним .position. Данное свойство имеет тип Point3 и содержит координаты опорной точки в активной системе координат.

Node_Объект.pos.controller

Контроллер перемещения. Как синоним можно использовать .pos.track

Node_Объект.pos.isAnimated

Логическое значение, определяющее возможность анимации местоположения объекта.

Node_Объект.pos.keys

Массив ключей анимации положения объекта

Node_Объект.pos.track

Контроллер перемещения. Как синоним можно использовать .pos.controller.

Node_Объект.rotation

Тип этого свойства – кватернион. В нем содержатся данные об ориентации осей объекта относительно активной системы координат.

Node_Объект.rotation.x_rotation

Поворот объекта по оси X.

Node_Объект.rotation.y_rotation

Поворот объекта по оси Y.

Node_Объект.rotation.z_rotation

Поворот объекта по оси Z.

Node_Объект.rotation.controller

Контроллер поворота. Как синоним можно использовать .rotation.track

Node_Объект.rotation.isAnimated

Логическое значение, определяющее возможность анимации поворота объекта.

Node_Объект.rotation.keys

Массив ключей анимации поворота объекта

Node_Объект.rotation.track

Контроллер поворота. Как синоним можно использовать .rotation.controller

Node_Объект.scale

Масштаб объекта по трем осям. Тип – Point3.

Node_Объект.scale.controller

Контроллер масштабирования. Как синоним можно использовать .scale.track

Node_Объект.scale.isAnimated

Логическое значение, определяющее возможность анимации масштабирования объекта.

Node_Объект.scale.keys

Массив ключей анимации масштабирования объекта

Node_Объект.scale.track

Контроллер масштабирования. Как синоним можно использовать .scale.controller.

Node_Объект.dir

Вектор в 3D пространстве, который определяет положение локальной оси Z объекта относительно активной системы координат

Node_Объект.max

Максимальные значения координат габаритного контейнера. Тип – Point3.

Node_Объект.min

Минимальные значения координат габаритного контейнера. Тип – Point3.

Node_Объект.center

Координаты центра габаритного контейнера. Тип – Point3.

Node_Объект.pivot

Координаты опорной точки объекта

Node_Объект.objectOffsetPos

Координаты объекта в мировой системе. Тип – Point3.

Node_Объект.objectOffsetRot

Ориентация объекта в мировой системе. Тип – кватернион.

Node_Объект.objectOffsetScale

Коэффициенты масштабирования объекта в мировой системе координат. Тип – Point3.

Node_Объект.objectTransform

Матрица, описывающая положение, ориентацию и масштаб объекта в мировой системе координат.

Определяемые пользователем свойства

Для каждого объекта, класс которого происходит от Node, можно определить ряд произвольных свойств. Можно сделать это вручную, используя пункт контекстного меню “Properties”. После его выбора появится диалог Object Properties. На закладке User Defined этого диалога Вы можете ввести любую информацию, касающуюся этого объекта. Если же Вам надо получить доступ к этой информации программно, то для этого используются следующие функции.

setUserProp Node_Объект Символьная_строка Значение

Первый параметр определяет объект, для которого определяется новое свойство, второй – имя этого свойства, третий – значение. Например, в результате такого скрипта

setUserProp $Sphere01 “Key1” 12.5

В окне User Defined Properties объекта $Sphere01 появится следующая строка

Key1 = 12.5

После того как свойство определено, его можно получить с помощью функции

getUserProp Node_Объект Символьная_строка

Первый параметр – объект, для которого запрашивается свойства, второй – имя этого свойства. Сразу все свойства, то есть весь текст окна User Defined Properties, можно получить с помощью функции

getUserPropBuffer Node_Объект

единственный параметр которой определяет объект, для которого запрашиваются значения всех свойств. Для установки всех свойств применяется функция

setUserPropBuffer Node_Объект Символьная_строка

Например, скрипт

setUserPropBuffer $Sphere01 “Key1=75.2\r\nKey2=99”

установит два свойства. Свойство Key1 будет равным 75.2, а Key2 – 99.

Reactor

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]