Клонирование узлов с помощью функции maxOps.CloneNodes
Ссылка
Синтаксис команды получения ссылки следующий: reference <узел>
Продолжите в следующем упражнении работу над предыдущим примером, создав на этот раз ссылку на объект.
1. Введите в окне приемника команд следующую строку кода:
r = reference b pos: [0,-25,0]
В этой строке создается ссылка на параллелепипед в стороне от исходного параллелепипеда, находящегося в точке начала отсчета.
2. Введите следующую строку кода: addmodifier r (bend())
Как видите, параллелепипед r теперь содержит модификатор Bend, который отсутствует у параллелепипеда b. Ссылочный параллелепипед r можно рассматривать в качестве порожденного объекта по отношению к исходному
Глава 3
параллелепипеду b, как к родительскому объекту. Любые изменения, вносимые в родительский объект, будут оказывать влияние на порожденный объект. В то же время изменения в порожденном объекте не будут оказывать влияния на родительский объект.
3. Выделите ссылочный параллелепипед и перейдите к панели команд Modify. Измените параметры модификатора Bend, наблюдая за результатами в видовом окне.
Изменения в модификаторе Bend не оказывают никакого влияния на параллелепипед b, поскольку у этого объекта модификатор Bend отсутствует.
4. Введите следующую строку кода: b.height = 40.0
Как видите, изменения распространяются на оба параллелепипеда. Это классический пример поведения ссылочного объекта.
В MAXScript имеется еще один, более сложный способ клонирования узлов. Приведенные выше способы пригодны для простых объектов, но дают непредсказуемые результаты при клонировании таких объектов с иерархиями, как источники света с собственными целями. Для клонирования с сохранением взаимосвязей между родительскими и порожденными объектами на сцене служит функция maxOps.CloneNodes. Синтаксис этой функции следующий:
maxOps.CloneNodes <массив узлов> clonetype: <enum> newNodes: <&массив узлов> actualNodeList: <&массив узлов> offset: <point3> ...
Данная функция возвращает логическое значение true при успешном выполнении и логическое значение false при неудачном выполнении.
Примечание. У функции maxOps.CloneNodes имеется больше параметров, чем перечислено выше. Для простоты здесь рассматривается лишь часть ее параметров.
Ниже приведены некоторые параметры функции maxOps.CloneNodes.
• <массив узлов> — это массив клонируемых узлов. Но если функции передается единственный объект, она обнаружит этот факт и автоматически свернет объект в массив.
• clonetype: <enum> — этот параметр может принимать одно из трех следующих значений: #copy (копия), #instance (экземпляр) или #reference (ссылка), а по умолчанию — #copy.
• newNodes: <&массив узлов> — этот массив узлов будет заполнен вновь клонированными узлами.
• actualNodeList: <&массив узлов> — в качестве этого необязательного параметра передается пустой массив, который будет заполнен конкретными
Интерфейс 3dsMax
клонированными узлами. Это объясняется тем, что между узлами возможны взаимосвязи, которые служат причиной появления в списке других узлов, например взаимосвязи между целями источников света и камер, узловыми частями систем, членами групп или расширенных иерархий.
• offset: <point3> — этот параметр перемещает новый узел по указанному вектору типа Point3. Он может быть использован для установления различий между вновь клонированными и старыми узлами.
В следующем упражнении демонстрируются отличия между обычным копированием и клонированием с помощью функции maxOps.CloneNodes.
1. Установите 3dsMax в исходное состояние и откройте окно приемника команд MAXScript Listener.
2. Создайте один нацеленный прожектор в сцене 3dsMax.
3. Выделите этот источник света. Только не выделяйте его цель.
4. Введите в окне приемника команд следующий фрагмент кода:
a = $
c = copy a
move c [0,25,0]
В итоге будет получена копия источника света, которая имеет общую с оригиналом цель. А для клонирования цели следует использовать функцию maxOps.CloneNodes.
5. Введите следующий фрагмент кода:
maxops.CloneNodes a actualNodeList: &ANL clonetype: #copy \
offset: [-25,-25, 0] newNodes: &NN
В итоге будет создан новый источник света с собственной целью.
6. Введите следующую строку кода: printANL
В этой строке на печать выводятся два объекта: источник света и его цель. В данном случае функции maxops.CloneNodes передан в качестве аргумента один источник света, а также адрес неинициализированного массива &ANL в качестве параметра actualNodeList. Функция заполнила массив старым источником света и старой целью источника света. Массив ANL, в общем, полезен лишь для проверки.
7. Введите следующую строку кода: selectNN
В сцене выделяются новый источник света и его цель. Кроме того, функции maxOps.CloneNodes в качестве параметра newNodes передан адрес неинициализированного массива &NN. А функция заполнила этот массив новым источником света и новой целью источника света. После вызова данной функции появляется возможность манипулировать новым узлом в массиве, как обычно.
Глава 3
Дополнительные сведения о применении функции maxOps.CloneNodes приведены в следующем разделе справочного руководства по MAXScript: MAXScript Language Reference ⇨ 3dsMax Objects ⇨ Interfaces ⇨ CoreInterfaces ⇨ Core Interfaces Pages ⇨ Interface: MaxOps (Справочник по языку MAXScript ⇨ Объекты 3dsMax ⇨ Интерфейсы ⇨ Базовые интерфейсы ⇨ Страницы базовых интерфейсов ⇨ Интерфейс: maxOps).