Модификатор SpherePush:
что делает: Модификатор "вытесняет" каждую вершину объекта, к которому применён, от опорных точек (pivot) заданных пользователем объектов с заданным радиусом. Воздействующими объектами могут служить любые объекты сцены, в примере это point_helper. Воздействующие объекты можно анимировать.
зачем нужен: Писал для вторичных анимаций у персонажа (перекатывающийся кадык при глотании; раздутая щека, когда что-то находится во рту; анимация живота и т.д.).
Видео на ютуб:
как использовать:
1)копируем код
2)создаём новый файл, называем его spherePush.ms
3)открываем файл spherePush.ms текстовым редактором. Например, блокнотом.
4)вставляем скопированный код.
5)файл кладём в 3dsmax_root\scripts\startup, где 3dsmax_root - дирректория, в которую у вас установлен 3DsMax
6)перегружаем макс, если был запущен, модификатор SpherePush должен появиться в списке доступных.
надеюсь, кому-нибудь пригодится
что делает: Модификатор "вытесняет" каждую вершину объекта, к которому применён, от опорных точек (pivot) заданных пользователем объектов с заданным радиусом. Воздействующими объектами могут служить любые объекты сцены, в примере это point_helper. Воздействующие объекты можно анимировать.
зачем нужен: Писал для вторичных анимаций у персонажа (перекатывающийся кадык при глотании; раздутая щека, когда что-то находится во рту; анимация живота и т.д.).
Видео на ютуб:
как использовать:
1)копируем код
2)создаём новый файл, называем его spherePush.ms
3)открываем файл spherePush.ms текстовым редактором. Например, блокнотом.
4)вставляем скопированный код.
5)файл кладём в 3dsmax_root\scripts\startup, где 3dsmax_root - дирректория, в которую у вас установлен 3DsMax
6)перегружаем макс, если был запущен, модификатор SpherePush должен появиться в списке доступных.
надеюсь, кому-нибудь пригодится
Код:
plugin simpleMod spherePush
name:"spherePush"
classID:#(0x329a4c0e, 0x652226e6)
(
parameters main rollout:params
(
nodes type:#nodeTab tabSizeVariable:true
radius type:#floatTab tabSizeVariable:true
an type:#integer animatable:true
on nodes tabChanged ar1 ar2 ar3 do
(
if (ar1==#refDeleted) do (deleteItem nodes ar2)
)
)
rollout params "Parameters" width:162 height:280
(
listbox lbx1 "nodes" pos:[8,5] width:144 height:8
button btn2 "remove" pos:[81,137] width:51 height:25
pickbutton btn3 "add" pos:[37,136] width:40 height:26
spinner spn1 "selection radius" pos:[11,169] width:144 height:16 range:[0,10000,0]
fn updateList =
(
items = #()
for n in nodes do append items n.name
lbx1.items = items
)
fn updateListSelection =
(
sel = lbx1.selection
spn1.enabled = (sel != 0)
if(sel != 0) do
(
spn1.controller = radius[sel].controller
spn1.value = radius[sel]
)
)
on params open do
(
updateList()
updateListSelection()
)
on lbx1 selected sel do
(
updateListSelection()
)
on btn2 pressed do
(
if(lbx1.selection>0) do
(
deleteItem nodes lbx1.selection
updateList()
updateListSelection()
)
)
on btn3 picked obj do
(
if( (findItem nodes obj) == 0) do
(
append nodes obj
append radius 25
updateList()
updateListSelection()
)
)
on spn1 changed val do
(
if (lbx1.selection != 0) do
(
radius[lbx1.selection] = spn1.value
)
)
)
on map i p do
(
for nID = 1 to nodes.count do
(
vec = p-nodes[nID].pos
dist = length vec
if(dist<radius[nID]) do p += ((radius[nID]-dist)*vec/dist)
)
p
)
on create do
(
an.controller = linear_float()
at time 10000
(
animate on
(
an = 10000.0f
)
)
)
)