Основные методы

getNodeByName <string> exact:<bool> ignoreCase:<bool> all:<bool>
Возвращает первый объект с заданным именем. Если параметр exact: равен false (значение по умолчанию), сравнение имен происходит по обычному стандартному алгоритму MAXScript.
Параметр ignoreCase: определяет, будет сравнение регистрозависимым или нет (т.е. приравниваются ли большие буквы к маленьким). Когда этот параметр равен true, выполняется сравнение без учета регистра.
Если параметр all: равен true, возвращается массив объектов с заданным именем (в сцене может существовать сколько угодно объектов с одним и тем же именем). Значения по умолчанию: - exact:false ignoreCase:true all:false

classOf <node>
Возвращает класс объекта (состояние объекта в верхней строке стека модификаторов). Если к основному объекту (нижняя строка стека) не применено никаких модификаторов, возвращается класс основного объекта. Если модификаторы применены, возвращается класс объекта после обработки последним модификатором. Например, если вы применили к объекту Box модификатор Bend, то этот модификатор превращает входящий примитив Box в сетку (mesh) и класс, возвращаемый функцией classOf будет Editable_Mesh.
Класс основного объекта при любых ситуациях можно узнать так: classOf <node>.baseObject


Методы работы со стеком модификаторов

validModifier [ <node> | <objectset> | <group> ] <modifier | modifier_class>
Проверяет, есть ли на объекте конкретный модификатор (модификатор с конкретным именем), либо возможность применения модификатора определенного класса к заданному объекту <node>, ко всем объектам набора <objectset> или к группе <group>. Если да, то возвращается значение true, если нет - false. Метод validModifier() ведет себя точно также, как и панель модификаторов при определении допустимости применения модификатора. Любой модикатор, работающий на деформируемом объекте, возвратит true для всех объектов сцены, кроме объектов типа Helpers. Это соответствует поведению панели Modify, допускающей применять модификаторы такие как Bend, Taper и т.п. к источникам света lights и камерам cameras или пространственным деформациям (space warp objects) точно также как и к геометрическим объектам типа box, sphere, и др., но не к вспомогательным объектам Helpers, например Dummy или Bones.
Метод validModifier() возвратит true, если задан пустой набор <objectset> или задана группа и модификатор допустим для всех членов группы. В этих случаях добавить модификатор методом addModifier() не удастся, потому что <objectset> пустой в первом случае и модификатор нельзя применить к объекту dummy во втором (ибо для всех членов группы есть родительский объект dummy).
Проверяйте подобные ситуации у себя в скрипте или используйте метод modPanel.addModToSelection().

addModifier <node> <modifier> [before:index] -- mapped
Эта функция применяет модификатор к объекту(ам) <node> и всем его(их) образцам (instance), для которых запущена. Дополнительный параметр before: может использоваться для вставки модификатора в конкретное место стека перед модификатором с указанным номером, считая сверху. Начиная с третьей версии 3ds Max, функция addModifier() не сохраняет выделение подобъектов, которые должны быть активны в стеке модификаторов перед добавлением нового модификатора. Если вы хотите добавить модификатор и сохранить выделенные подобъекты, используйте метод modPanel.addModToSelection().
Если аргумент <node> является коллекцией, образец модификатора применяется к каждому объекту коллекции. В отличие от интерактивного применения модификатора к выделенным объектам, положение и размер каждого образца модификатора соответствует положению и размеру объекта, к которому применен образец модификатора. Чтобы применить модификатор к коллекции таким же образом, каким обычно 3ds Max применяет модификаторы, используйте метод modPanel.addModToSelection().

deleteModifier <node> <modifier_or_index> -- mapped
Метод позволяет вам удалить модификатор из стека. Удаление происходит по имени модификатора в стеке или по индексу, считая от вершины стека.

collapseStack <node> -- mapped
Метод сворачивает все модификаторы в стеке, оставляя в результате объект класса в соответствии с действием верхнего модификатора в стеке. Если в момент вызова метода в стеке нет модификаторов - ничего не происходит. Если вы хотите, чтобы объект свернулся в редактируемую сетку editable mesh, используйте функцию convertToMesh().


Методы преобразования (конвертации) объектов

convertToMesh <node> -- mapped
Этот метод преобразует объекты допустимых типов в редактируемые сетки. Он похож на метод collapseStack() тем, что тоже удаляет все модификаторы, но в отличие от collapseStack(), всегда заменяет базовый объект его версией редактируемой сетки, даже если у объекта нет модификаторов. Метод convertToMesh() может применяться ко всем объектам, с которыми работает модификатор Edit Mesh, таким как geometry и shapes, но не к объектам helpers, space warps, lights и им подобным. Если объект не может быть конвертирован, метод возвратит значение undefined.

convertToSplineShape <node> -- mapped
Метод конвертирует заданный объект сцены в объект SplineShape. Если конвертация невозможна (как правило такое бывает, если класс объекта не принадлежит к одному из классов shape), возвращается значение undefined. Любые наложенные на объект модификаторы будут свернуты. Также можно использовать метод collapseStack(), работающий аналогично кнопке Collapse на панели модификаторов. Обе создают объект SplineShape, но только в том случае, если на объекте есть как минимум один модификатор.

canConvertTo <node> <class>
Метод позволяет проверить, возможно ли конвертировать заданный объект в объект определенного класса. Возвращается значение true, если можно либо false, если нет. Например: if canConvertTo $foo NURBSSurface then ...
Виды классов, в которые вы можете конвертировать объекты являются основными формами редактируемых объектов, включая Mesh, SplineShape, NURBSCurve, NURBSSurface и др.

convertTo <node> <class> -- mapped
Этот метод - основная форма для существующих методов конвертации, таких как convertToMesh(), convertToSplineShape() и т.п. Например, аналог convertToSplineShape() можно записать так: convertTo $circle01 SplineShape
Если конвертация не поддерживается, метод возвратит значение undefined.

convertToNURBSSurface <node> -- mapped
convertToNURBSCurve <node> -- mapped
Эти методы работают с теми классами примитивов geometry и shape, которые поддерживают пребразование в NURBS (такие классы, как box, sphere, circle, line и др.). Если объект не поддерживает конвертацию, метод возвращает undefined.

Полезные методы-утилиты

intersectRay <node> <ray>
Метод вычисляет ближайшую точку пересечения луча (ray) с поверхностью заданного объекта. Луч - это вектор, исходящий из определенной точки (которая представлена другим вектором). Для лучей существует собственный конструктор ray, дальше на примерах будет понятно, как с ним работать. Результатом работы метода является другой луч, который определяет точку пересечения в трехмерном пространстве и вектор нормали к поверхности объекта в этой точке. Алгоритм определения пересечения принимает во внимание нормали граней объекта, т.е. если нормаль грани направлена в сторону от точки, из которой исходит луч, то для данной грани проверка на пересечение не выполняется. Метод intersectRay() работает тех случаях, когда объект в итоговом состоянии (состояние в верхней строке стека) имеет поверхность, т.е. для объектов-сеток, стандартных, расширенных или составных примитивов, лоскутков (Patch) или NURBS-поверхностей. У сплайнов и NURBS-кривых поверхности нет. Метод возвращает значение undefined в трех случаях:
  1. Если луч не пересекает объект.
  2. Нормаль грани, которую должен пересекать луч, направлена в сторону от источника луча.
  3. Объект не имеет поверхности.

Пример (бомбардировка сферами):
obj=GeoSphere radius: 50
addModifier obj (Noisemodifier strength: [50,50,50])
for i=1 to 25 do (
p=[(random -30.0 30.0), (random -30.0 30.0), 100]
arr=intersectRay obj (ray p [0,0,-1])
if arr!=undefined then (s=sphere pos: arr.pos radius: (random 1.0 10.0)
obj-=s
delete s
)
redrawViews()
)

intersectRayEx <node> <ray>
Метод вычисляет ближайшую точку пересечения луча (ray) с поверхностью заданного объекта. Это более продвинутый метод в отличие от предыдущего, он возвращает массив со следующими тремя элементами:
  1. Луч, определяющий точку пересечения в трехмерном пространстве и вектор нормали к поверхности объекта в этой точке.
  2. Номер грани, с которой пересекся луч.
  3. Барицентрические координаты точки на грани, в которую попал луч.
Данный метод работает только в случае, когда итоговое состояние объекта - сетка mesh, т.е. когда класс объекта editable mesh, или на объект наложены модификаторы, которые преобразуют его в сетку. В отличие от метода intersectRay(), этот метод не работает ни со стандартными, ни с расширенными примитивами, т.к. стек должен быть в итоге преобразован в сетку. Как и в методе intersectRay() в intersectRayEx во внимание принимается направление нормалей граней объекта, т.е. если нормаль грани направлена в сторону от точки, из которой исходит луч, то для данной грани проверка на пересечение не выполняется. Метод возвращает значение undefined, если луч не пересекает объект, если нормаль грани, которую он должен пересечь, смотрит в сторону от источника луча или если объект не является сеткой mesh.

Что такое барицентрические координаты (BARYCENTRIC COORDINATES)?
Это координаты относительно треугольной грани. Барицентрические координаты точки p относительно треугольника описывают эту точку как взвешенную сумму вершин треугольника. Если барицентрические координаты это числа b0, b1 и b2, то p = b0*p0 + b1*p1 + b2*p2, где p0, p1 и p2 - координаты вершин треугольника. Координаты даются относительно треугольной грани, с которой произошло пересечение.
Также барицентрические координаты могут использоваться для интерполяции любой зависимости, значение которой представлено вершинами треугольника (например UVW-mapping).

Пример из хелпа - нахождение UVW координат точки пересечения:
s = sphere material:(standardMaterial diffuseMap:(checker()))
showTextureMap s.material s.material.diffuseMap on
addModifier s (normalModifier()) --ДОБАВЛЯЕМ МОДИФИКАТОР normal, ЧТОБЫ ПРЕОБРАЗОВАТЬ СФЕРУ В mesh
r = ray [-100,5,0] (s.center-[-100,5,0])
arr = (intersectRayEx s r) --ПОЛУЧАЕМ МАССИВ С ДАННЫМИ О ПЕРЕСЕЧЕНИИ
dummy pos:(arr[1]).pos --СОЗДАЕМ ПУСТЫШКУ В ТОЧКЕ ПЕРЕСЕЧЕНИЯ
tf = getTVFace s arr[2] --ПОЛУЧАЕМ ГРАНЬ ТЕКСТУРЫ
--ПОЛУЧАЕМ UVW ВЕРШИНЫ ЭТОЙ ГРАНИ
tv1 = getTVert s tf.x
tv2 = getTVert s tf.y
tv3 = getTVert s tf.z
--ВЫЧИСЛЯЕМ ТЕКСТУРНЫЕ ВЕРШИНЫ В ТОЧКЕ ПЕРЕСЕЧЕНИЯ
tv = tv1*arr[3].x + tv2*arr[3].y + tv3*arr[3].z --БАРИЦЕНТРИЧЕСКИЕ КООРДИНАТЫ
deleteModifier s 1 --УДАЛЯЕМ МОДИФИКАТОР

А вот мой собственный пример для контроллера Attachment, который тоже использует барицентрические координаты, но не для значений UVW, а для удержания одного объекта на поверхности другого:
obj=GeoSphere radius: 50 pos: [0,0,0]
addModifier obj (Noisemodifier animate: on strength: [30,30,30])
addModifier obj (Edit_Mesh name: "BFS_tempdel")
pp=point size: 20 centermarker:false axistripod:false cross:true box:true wireColor:[255,0,0] name: "IntPoint"
arr=intersectRayEx obj (ray [-100,0,0] [1,0,0])
pp.pos=arr[1].pos
tf = getTVFace obj arr[2]
tv1 = getTVert obj tf.x
tv2 = getTVert obj tf.y
tv3 = getTVert obj tf.z
tv = tv1*arr[3].x + tv2*arr[3].y + tv3*arr[3].z
actrl = Attachment()
pp.position.controller=actrl
actrl.node = obj
addNewKey actrl 0f
theAKey = AttachCtrl.getKey actrl 1
theAKey.face = arr[2] - 1
theAKey.coord = tv
deleteModifier obj obj.modifiers[#BFS_tempdel]


intersects <node> <node>
Возвращает значение true, если габаритные контейнеры двух объектов перекрываются и false, если нет.

printStack <node>
Печатает информацию о текущем состоянии стека модификаторов для заданного объекта.

Связанные методы

uniqueName <prefix>
Генерирует уникальное имя объекта сцены на основе строки-префикса путем добавления набора цифр, аналогично тому, как 3ds Max автоматически присваивает имена объектам сцены, когда вы их создаете. Это имя гарантированно будет отличаться от имен объектов, существующих в сцене на данный момент. Пример: $foo.name = uniqueName "foo"