Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Get the positions WITHIN a part?

Asked by
Shawnyg 4330 Trusted Badge of Merit Snack Break Moderation Voter Community Moderator
10 years ago

The title may be a bit confusing, but let's take the default Baseplate for example. Let's say the Baseplate's size is (512, 20, 512). The position is (0,0,0). When I try to position a part randomly onto that baseplate, I find it hard to think of how to do it. Say if I do position a part to 0,0,0; it would only be in the MIDDLE of it. How do I find the amount of studs within? I've accomplished this by taking the locations of the X and Z of the ends, but I just want to do all of that in a script. Confused? Comment

Script:


function snow() while wait() do -- got here try 1 a = game.Lighting.Part:clone() print('cloned') for i,v in pairs(game.Workspace:GetChildren()) do if v.Name == "Baseplate" then a.Position = Vector3.new(math.random(-257,257), 200, math.random(-254,254)) end end game.Workspace["Snow Script"].Script:clone().Parent = a a.Parent = Workspace a.Script.Disabled = false print('set') end end snow()

2 answers

Log in to vote
0
Answered by
BlueTaslem 18071 Moderation Voter Administrator Community Moderator Super Administrator
10 years ago

You can use the concept of object space.

Normally, positions are relative to some absolute reference -- the origin (0,0,0).

That choice is arbitrary; we can recompute positions relative to any object.

local inside = part.Size
    * Vector3.new( math.random() - 0.5, math.random() - 0.5, math.random() - 0.5);
-- A random point on the interior of part.Size

local world = part.CFrame:pointToWorldSpace( inside )
-- world is a Position that you can use, that will be somewhere inside `part`



You shouldn't be using the loop that you are on line 6.

That would be much better phrased like this:

a.Position = Vector3.new(math.random(-257,257), 200, math.random(-254,254))

(you weren't even using v at all in the loop! If you were, instead just use workspace.Baseplate)

Ad
Log in to vote
0
Answered by
Perci1 4988 Trusted Moderation Voter Community Moderator
10 years ago

If the size is 512 by 512 and the position is 0, then positioning the snow between 512/2 and -(512/2) should give us a place on the baseplate.

Since the base is positioned at 0,0,0, half of it will be on the positive side of the coordinate plain and half of it will be on the negative side of the coordinate plain. Therefore, the brick must be somewhere between 256 and -256 on both the x and z axis. (256 is half of 512.) I have the x, y, and z separated for clarity.

part.Position = Vector3.new(
--x axis; random position between 256 and -256
math.random(-256, 256),
--y axis; always fall at the same height
200,
--z axis; random position between 256 and -256
math.random(-256, 256)
)

Answer this question