Одну и ту же задачу можно решить средствами 3ds Max SDK и MAXScript. Для иллюстрации этого положения реализуем прежде плагин создания куба на MAXScript, дав плагину имя CubeMS.
plugin simpleObject CubeMS name:»CubeMS» classID:#(145340, 543210) category:»Scripted Primitives» (
parameters main rollout:params (
size type:#worldUnits ui:size default:0
)
rollout params «Cube Size» (
spinner size «Size: » type:#worldunits range:[0, 100, 0] scale:1
)
on buildMesh do (
h = 0.5 * size
arrVrts = #([-h, -h, -h], [h, -h, -h], [-h, h, -h], [h, h, -h], \
[-h, -h, h], [h, -h, h], [-h, h, h], [h, h, h])
arrFcs = #([1, 3, 4], [4, 2, 1], [5, 6, 8], [8, 7, 5], \
[1, 2, 6], [6, 5, 1], [2, 4, 8], [8, 6, 2], \
[4, 3, 7], [7, 8, 4], [3, 1, 5], [5, 7, 3])
setMesh mesh verts:arrVrts faces:arrFcs
setFaceSmoothGroup mesh 1 2; setFaceNormal mesh 1 [0, 0, -1]
setFaceSmoothGroup mesh 2 2; setFaceNormal mesh 2 [0, 0, -1]
setFaceSmoothGroup mesh 3 4; setFaceNormal mesh 3 [0, 0, 1]
setFaceSmoothGroup mesh 4 4; setFaceNormal mesh 4 [0, 0, 1]
setFaceSmoothGroup mesh 5 8; setFaceNormal mesh 5 [0, -1, 0]
setFaceSmoothGroup mesh 6 8; setFaceNormal mesh 6 [0, -1, 0]
setFaceSmoothGroup mesh 7 16; setFaceNormal mesh 7 [1, 0, 0]
setFaceSmoothGroup mesh 8 16; setFaceNormal mesh 8 [1, 0, 0]
setFaceSmoothGroup mesh 9 32; setFaceNormal mesh 9 [0, 1, 0]
setFaceSmoothGroup mesh 10 32; setFaceNormal mesh 10 [0, 1, 0]
setFaceSmoothGroup mesh 11 64; setFaceNormal mesh 11 [-1, 0, 0]
setFaceSmoothGroup mesh 12 64; setFaceNormal mesh 12 [-1, 0, 0]
for k = 1 to 12 do setEdgeVis mesh k 3 false
)
tool create (
on mousePoint click do
case click of (
1: nodeTM.Translation = gridPoint
3: #stop
)
on mouseMove click do
case click of (
2: size = amax gridDist.X gridDist.Y
3: size = gridDist.Z
)
)
)
Программа содержит секцию (Rollout) params, обеспечивающую задание размера куба (счетчик Size). Значение счетчика связано с одноименным параметром, заданным в блоке Parameters.
Инструмент создания куба (мышка) задается блоком Tool Create. После выбора позиции (событие mousePoint с параметром click = 1) определяется часть Translation (перемещение) матрицы аффинных преобразований куба (nodeTM.Translation = gridPoint). Далее при нажатой левой кнопке мыши фиксируется ее перемещение в видовом порте; величина перемещения определяет размер куба.
После освобождения мыши сцена может принять очередной куб.
Родительским классом куба является класс SimpleObject. Класс куба имеет имя CubeMS.
Для получения идентификатора класса classID следует употребить имеющуюся в папке ..\Autodesk\3ds Max 20хх SDK\maxsdk\help программу gencid.exe (рис. 4).
Рис. 4. Генератор идентификатора класса плагина
Параметризованный куб создается обработчиком buildMesh в результате применения метода SetMesh, получающего массив arrVrts с координатами вершин примитива и массив его граней arrFcs. Размер куба определяется значением параметра Size. Сглаживающие группы и нормали куба заданы по аналогии с примитивом Box.
После копирования и запуска кода в MAXScript Editor, плагин будет доступен на вкладке Create – Geometry – Scripted Primitives (рис. 5).
Рис. 5. Вызов плагина CubeMS
Категория (Scripted Primitives) и положение элемента в командном окне определяются параметрами выражения Plugin. Так, класс SimpleObject указывает на принадлежность примитива к геометрическим объектам, понятно и назначение свойства Category.
После загрузки плагина кубом можно оперировать средствами языка MAXScript, например:
delete $*
cb = cubeMS size:40
animate on at time 100 (
cb.Size = 60
rotate cb 360 [0, 0, 1]
)
playAnimation()
Заметим, что созданный объект не имеет текстурных координат, поэтому при употреблении материала следует позаботиться о создании таких координат, например при помощи модификатора UVWmap:
delete $*
cb = cubeMS size:50
addModifier cb (UVWmap maptype:4 ui:on)
chk = checker()
chk.Coordinates.U_Tiling = chk.Coordinates.V_Tiling = 2
std = standard diffuseMap:chk showInViewport:true diffuseMapEnable:true
cb.Material = std
