Клонирование узлов с помощью функции 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).