0

I have created the following script to generate "fireworks" (term used loosely) as directed my tutor. It is based on skeleton script that I MUST use.

There are spinner to control certain parameters, however for the life of me I can not figure out what is wrong! Please help me!!!

The task was to animate via script, a sphere that went up, where the faces "exploded" and changed direction downwards via a time scale.

(firework goes up, explodes, and debris fall to earth)

I believe what I have written is correct, however no animation is actually generated. Despite my BEST effort and months of hard work.

I am new to coding, and did not sign up for any coding. All I wanted to do was to learn how to model. However my tutor holds the key to my pass.

At this present time I am ready to "rage quit" and am simply going out of my mine. ANY help would be greatly appreciated.

Here is the script I have written thus far...

-- Empty varables to be called in or adjusted by spinners

numOfSpheres = 0 --number of exploding spheres
sphereRadius = 0
creationBoxSize = 0 -- spawn radius in what box size?
objs = #() -- objs created go to empty array! 
maxHeight = 0
startTime = 0



dropping = false --boolean flag to trigger the falling sphere stage

animate on
(
    for i = 1 to numOfSpheres by 1 do
    (
        at time (startTime + 50.000) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
        at time (startTime + 50.001) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
        at time (startTime + 100)    ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 100 0 )

        at time (startTime) ( objs[i].pos = objs[i].pos )

        local height = maxHeight

        for t = 5 to 100 by 5 do
        (
            height = height - 2
            at time (startTime + t) ( objs[i].pos = objs[i].pos + [ 0, 0, height] )
        )
    )
)

rollout FireWorks "FireWorks" 
( -- button ui code starts here
    label lbl1 "By Luke Fahy" style_sunkenedge:true width:67 height:17
    spinner count "FireWorks: " type:#integer range:[1,100,10]  -- 1 to a 100: default value of 10: integer = whole number not fraction!
    spinner size "Size: " type:#float range:[0.1,30,1] 
    spinner sPlane "Spawn Plane: " type:#integer range:[1,200,30]
    spinner maxHeightSpinner "Max Height: " type:#float range:[1,100,14]
    spinner startTimeSpinner "Start Time: " type:#float range:[1,100,1]
    button create "Create Fireworks"

    on create pressed do -- Event handler code start
    (
        numOfSpheres = count.value
        sphereRadius = size.value 
        creationBoxSize = sPlane.value 
        maxHeight = maxHeightSpinner.value 
        startTime = startTimeSpinner.value

        dropping = false

        --create spheres
        for i = 1 to numOfSpheres by 1 do
        (
            objs[i] = sphere radius:sphereRadius
            local r = random 0 255
            local g = random 0 255
            local b = random 0 255
            objs[i] .wirecolor = (color r g b)
            objs[i] .pos = [random creationBoxSize -creationBoxSize, random creationBoxSize -creationBoxSize, 0]   -- random possative and negative x/y values to create spawn box. 

            convertToMesh objs[i]
            meshOp.explodeAllFaces objs[i] 0
        )
    )
) -- button ui code end 

createDialog FireWorks width:200

Also, any suggestion for my comments and indentation would be appreciated. (formatting seems to have been thrown out of the window upon cut and past, my apologies I'm new to this forum. File is as attachment)

Kind regards, ShineSmith :)

Additional Info:

Further more, here is the script my tutor gave me to base my work on.

(object array required here, or name of singular object. Others used the $name of a single sphere and instances of it to replicate multiple "fireworks")

convertToMesh $

meshop.explodeAllFaces $ 0

update $

v = 20

animate on
(
    at time (sliderTime+50.000) ( meshop.bevelFaces $ #{1..$.numFaces} 0.0000001 0 )
    at time (sliderTime+50.001) ( meshop.bevelFaces $ #{1..$.numFaces} 0.0000001 0 )
    at time (sliderTime+100)    ( meshop.bevelFaces $ #{1..$.numFaces} 100 0 )

    at time (sliderTime) ( $.pos = $.pos )
    for t = 5 to 100 by 5 do
    (
        v = v - 2
        at time (sliderTime+t) ( $.pos = $.pos + [0,0,v] )
    )
)
Limon Monte
  • 52,539
  • 45
  • 182
  • 213

2 Answers2

0

You are running the animation code before any spheres are created and before your Rollout is even created. Move the animate on (...) block inside your on create handler, or make it a separate function.

Rotem
  • 21,452
  • 6
  • 62
  • 109
0

Move the antimation code into a function:

fn doanimate =
(
    animate on
    (
        for i = 1 to numOfSpheres by 1 do
        (
            at time (startTime + 50.000) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
            at time (startTime + 50.001) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
            at time (startTime + 100)    ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 100 0 )

            at time (startTime) ( objs[i].pos = objs[i].pos )

            local height = maxHeight

            for t = 5 to 100 by 5 do
            (
                height = height - 2
                at time (startTime + t) ( objs[i].pos = objs[i].pos + [ 0, 0, height] )
            )
        )
    )
)

Call the function at the end where you press the button:

 on create pressed do -- Event handler code start
    (
        numOfSpheres = count.value
        sphereRadius = size.value 
        creationBoxSize = sPlane.value 
        maxHeight = maxHeightSpinner.value 
        startTime = startTimeSpinner.value

        dropping = false

        --create spheres
        for i = 1 to numOfSpheres by 1 do
        (
            objs[i] = sphere radius:sphereRadius
            local r = random 0 255
            local g = random 0 255
            local b = random 0 255
            objs[i] .wirecolor = (color r g b)
            objs[i] .pos = [random creationBoxSize -creationBoxSize, random creationBoxSize -creationBoxSize, 0]   -- random possative and negative x/y values to create spawn box. 

            convertToMesh objs[i]
            meshOp.explodeAllFaces objs[i] 0
        )
        doanimate()
    )

The full script would now look like this:

-- Empty varables to be called in or adjusted by spinners

numOfSpheres = 0 --number of exploding spheres
sphereRadius = 0
creationBoxSize = 0 -- spawn radius in what box size?
objs = #() -- objs created go to empty array! 
maxHeight = 0
startTime = 0



dropping = false --boolean flag to trigger the falling sphere stage
fn doanimate =
(
    animate on
    (
        for i = 1 to numOfSpheres by 1 do
        (
            at time (startTime + 50.000) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
            at time (startTime + 50.001) ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 0.0000001 0 )
            at time (startTime + 100)    ( meshop.bevelFaces objs[i]  #{1..objs[i].numFaces} 100 0 )

            at time (startTime) ( objs[i].pos = objs[i].pos )

            local height = maxHeight

            for t = 5 to 100 by 5 do
            (
                height = height - 2
                at time (startTime + t) ( objs[i].pos = objs[i].pos + [ 0, 0, height] )
            )
        )
    )
)
rollout FireWorks "FireWorks" 
( -- button ui code starts here
    label lbl1 "By Luke Fahy" style_sunkenedge:true width:67 height:17
    spinner count "FireWorks: " type:#integer range:[1,100,10]  -- 1 to a 100: default value of 10: integer = whole number not fraction!
    spinner size "Size: " type:#float range:[0.1,30,1] 
    spinner sPlane "Spawn Plane: " type:#integer range:[1,200,30]
    spinner maxHeightSpinner "Max Height: " type:#float range:[1,100,14]
    spinner startTimeSpinner "Start Time: " type:#float range:[1,100,1]
    button create "Create Fireworks"

    on create pressed do -- Event handler code start
    (
        numOfSpheres = count.value
        sphereRadius = size.value 
        creationBoxSize = sPlane.value 
        maxHeight = maxHeightSpinner.value 
        startTime = startTimeSpinner.value

        dropping = false

        --create spheres
        for i = 1 to numOfSpheres by 1 do
        (
            objs[i] = sphere radius:sphereRadius
            local r = random 0 255
            local g = random 0 255
            local b = random 0 255
            objs[i] .wirecolor = (color r g b)
            objs[i] .pos = [random creationBoxSize -creationBoxSize, random creationBoxSize -creationBoxSize, 0]   -- random possative and negative x/y values to create spawn box. 

            convertToMesh objs[i]
            meshOp.explodeAllFaces objs[i] 0
        )
        doanimate()
    )
) -- button ui code end 

createDialog FireWorks width:200
IAmNoone
  • 1,011
  • 1
  • 8
  • 25