home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Maximum 3D 3
/
m3d-p3.iso
/
3DS_MAX
/
3DSMAX.2_0
/
SCRIPTS
/
MORPHER.MS
< prev
next >
Wrap
Text File
|
1997-10-19
|
4KB
|
129 lines
-- This is a scripted rollout that opens a modeless window
-- of sliders each with a snap button. You choose a NURBS CV
-- surface object in the scene and then can 'snap' poses of
-- CV and weight edits (made in the NURBS Surface CV modifier panel)
-- and then use the sliders as a 'pose mixer' which you can keyframe
-- in the usual way in MAX
-- John Wainwright
rollout morpher "Morpher"
(
local talker, tset, surf, snap_pos, set_pos, start, snaps,
slider = #(0,0,0,0,0)
label pl "Pick object: " align:#left
pickbutton pickit "none" width:100 offset:[-20,-20]
button save "Save" offset:[76,-26] enabled:false
button load "Load" offset:[122,-26] enabled:false
group "Mixer"
(
slider oh "Target 1" orient:#vertical across:5 enabled:false
slider ee "Target 2" orient:#vertical enabled:false
slider smile "Target 3" orient:#vertical enabled:false
slider growl "Target 4" orient:#vertical enabled:false
slider sad "Target 5" orient:#vertical enabled:false
button snapoh "Snap" across:5 enabled:false
button snapee "Snap" enabled:false
button snapsmile "Snap" enabled:false
button snapgrowl "Snap" enabled:false
button snapsad "Snap" enabled:false
)
on pickit picked obj do
(
talker = obj; pickit.text = obj.name
tset = getNURBSSet talker #relational
surf = getObject tset 1
start = #()
for i in 1 to surf.numcvs.x do
for j in 1 to surf.numcvs.y do
(
cv = getcv surf i j
append start (NURBSControlVertex cv.pos cv.weight)
)
snaps = for s in 1 to 5 collect
for i in 1 to surf.numcvs.x * surf.numcvs.y collect (NURBSControlVertex [0,0,0] 0)
save.enabled = load.enabled = true
oh.enabled = ee.enabled = smile.enabled = growl.enabled = sad.enabled = true
snapoh.enabled = snapee.enabled = snapsmile.enabled = snapgrowl.enabled = snapsad.enabled = true
)
on snapoh pressed do snap_pos talker 1
on snapee pressed do snap_pos talker 2
on snapsmile pressed do snap_pos talker 3
on snapgrowl pressed do snap_pos talker 4
on snapsad pressed do snap_pos talker 5
fn snap_pos obj which =
(
snaps[which] = #()
-- snap pos & weight
local k = 1
for i in 1 to surf.numcvs.x do
for j in 1 to surf.numcvs.y do
(
cv = getcv surf i j
append snaps[which] (NURBSControlVertex (cv.pos - start[k].pos) (cv.weight - start[k].weight))
k += 1
)
-- reset to start config
k = 1
for i in 1 to surf.numcvs.x do
for j in 1 to surf.numcvs.y do
(
cv = getcv surf i j
cv.pos = start[k].pos
cv.weight = start[k].weight
k += 1
)
)
on oh changed val do set_pos 1 val
on ee changed val do set_pos 2 val
on smile changed val do set_pos 3 val
on growl changed val do set_pos 4 val
on sad changed val do set_pos 5 val
fn set_pos which val =
(
slider[which] = val / 100
local k = 1
for i in 1 to surf.numcvs.x do
for j in 1 to surf.numcvs.y do
(
delta_p = [0,0,0]; delta_w = 0
for s in 1 to 5 do
(
delta_p += snaps[s][k].pos * slider[s]
delta_w += snaps[s][k].weight * slider[s]
)
cv = getcv surf i j
if (new_p = start[k].pos + delta_p) != cv.pos then cv.pos = new_p
if (new_w = start[k].weight + delta_w) != cv.weight then cv.weight = new_w
k += 1
)
)
on save pressed do
(
local f = createFile (getSaveFileName ())
for s in 1 to 5 do for p in snaps[s] do format "% %\n" p.pos p.weight to:f
close f
)
on load pressed do
(
local f = openFile (getOpenFileName ())
snaps = for s in 1 to 5 collect
for i in 1 to surf.numcvs.x * surf.numcvs.y collect (NURBSControlVertex (readValue f) (readValue f))
close f
)
)
-- create the rollout window and add the morpher rollout
tfw = newRolloutFloater "Morph" 320 248
addRollout morpher tfw