[Closed] Path Constraint Randomly Placed Objects
I am looking to make a script that will randomly place all my selected objects onto a path without placing any on top of each other.
I am able to grab a bit of code from the maxscript listener but I am unsure as to where to go from here.
select $‘rpc_Ford Focus07’
sliderTime = 2070f
$.pos.controller.Path_Constraint.controller.percent = 49.9
I am not much of a maxscripter so I am not sure how to write code for this.
I would need to create an array of random numbers (1-100% on the path) for the amount of objects selected, then make sure no duplicate numbers are generated. At this point I would select the path I would want to constrain the objects to and the script would place the objects on the path at the percentages in the array.
Can anyone give me a hand with this? Is this possible? Did I explain it clear enough?
Thanks for your help!
hi wakkamis,
here is my quick try on it:
(
if selection.count > 1 and isKindOf $[1] shape then (
local pathObj = $[1]
local pathLength = curveLength pathObj
local distObjs = for i = 2 to selection.count collect selection[i]
fn getObjDiameter obj =
(
local bb = nodeLocalBoundingBox obj
(distance bb[1] bb[2]) / (sqrt 3)
)
local distObjsDiameter = for o in distObjs collect getObjDiameter o
for i = 1 to distObjs.count do (
local pc = path_constraint()
pc.constraints.appendTarget pathObj 100
pc.follow = true
pc.constantVel = true
local dist = distObjsDiameter[i] / 2
if i > 1 then
dist += (distObjsDiameter[i - 1] / 2) + pathLength * (distObjs[i - 1].pos.controller.percent / 100)
local maxRand = pathLength - dist
if i < distObjs.count then (
for j = i + 1 to distObjs.count do
maxRand -= distObjsDiameter[j]
)
maxRand /= (distObjs.count - i + 1)
dist += random (maxRand / 2) maxRand
pc.percent = 100 * dist / pathLength
distObjs[i].pos.controller = pc
)
)
)
the code is not so elegant but it kind of does the job.
simply select the path first and then the objects you want to distribute on it and evaluate the script.
Cheers,
Matan.
Hi Matan,
No worries on the code not being elegant. Not so sure I would know what elegant code looks like if it bite me on my nose! :surprised
Thanks much for taking a stab at this. I shall give this a try when I get a chance.
Guess I got to checking it sooner than I thought.
So the script lays the objects out randomly along the beginning of the path well.
Unfortunately it clusters them together and always places them at the beginning of the path. An interesting effect occurs when I move the timeline down the path and run the script. It will still place the objects at the beginning of the path. So if I have a timeline from 0-100 and have the slider at 50, run the script, then scrub back to frame 0 the objects will then be 50% down the path.
Wondering if the script could be tweaked to space out the objects much more than what is going on now. Something more like the screen shot below.
Thanks again for your help! :bowdown: