Finding every single Vector3 point that is inside a part

Currently I have a searchlight system where beams go everywhere for 5 seconds and then stop on one object.

I’m having trouble figuring out a way that I can use a BasePart to specify what the limits for where the bottom attachments for the beams can go.

Is there any way I can find every single Vector3 point that is inside a part?

Unsure if this is what you meant, but you can use the width, length and height of the part to determine the lowest, highest, furthest and closest points of where the lights could search. In this case if you need the parameters of the base plate, you’d have the Vector3 point given, and then using the width, length and height you can find all of its other corners.

How would you do that? I’m not very good with math.

Something along the lines of

local part = game.Workspace.Part
local corner1 = part.Position
local corner2 = Vector3.new(corner1.X, corner1.Y + part.Size.Y, corner1.Z)
local corner3 = Vector3.new(corner1.X + part.Size.X, corner1.Y, corner1.Z)

And then you can continue that for whichever other corners you need.

How would I use this to determine if a point is inside a block?

I’d recommend looking into this and this as they both go over part intersection thoroughly and in a more efficient manner.

Else-wise, you’d have to create a function which simply checks that all 3 of the Vector3 values are within those corner parameters. For example you’d check that the X is less than the X of corner 2 and more than the X of corner 1, which you’d then have to do for all 4 corners.

What exactly are you trying to do?( i dont understand) , can your provide a visual representation ( video, images etc.), you can do as @rabbiguy950 essentially said to find if a point is in a block, if you wanted to find if a position in a AABB or Axis-Aligned Bounding Box, meaning it’s without rotation of a part you can do this:


local function IsWithinObject(Object, Position) --Axis Aligned!!!
	local Offset = 0
	local minX, maxX = Object.Position.X - (Object.Size.X + Offset)/2 , Object.Position.X + (Object.Size.X + Offset)/2
	local minZ,  maxZ  = Object.Position.Z - (Object.Size.Z + Offset)/2, Object.Position.Z +(Object.Size.Z + Offset)/2
	local minY,  maxY  = Object.Position.Y - (Object.Size.Y + Offset)/2, Object.Position.Y +(Object.Size.Y + Offset)/2

	if math.clamp(Position.X, minX, maxX) ~= (minX or maxX)    and math.clamp(Position.Z, minZ,  maxZ) ~= (minZ or  maxZ) and math.clamp(Position.Z, minY,  maxY) ~= (minY or  maxY)  then
                 return true
	else
		return false
     end
end

But like i said this is only for AABB bounding boxes meaning you would have to apply orientation to the function. Also i would not advise going through every single vector ( including in a table) of a part as it can be expensive especially when a part is really large or without any sort of heap. Anyways there a probably multiple ways to solve your problem.

This would only work with rectangular based parts as well, right?

Yep This will only work on Cuboids, to find if a position is inside any shaped part you would probably have to use ray casting or some algorithm to figure out the bounds to compare positions( i am not sure what the OP is asking though). i don’t think there really is a easy way to solve the problem in this tread or one definite solution, but there are ways to go about it.

I’m looking for a method to choose a random point in a bounding box. How could I do that?

First you need to define the bounds using the corner method shown above, and then afterwards you’d randomly create the point as is:

local pointX = math.random(xMin, xMax)
local pointY = math.random(yMin, yMax)
local pointZ = math.random(zMin, zMax)
local point = Vector3.new(pointX, pointY, pointZ)