At its most basic level, raycasting is the act of sending out an invisible ray from a Vector3 point in a specific direction with a defined length. Once cast, you can detect if the ray hits a BasePart or Terrain cell.
Casting a Ray
You can cast a ray with the WorldRoot:Raycast() method (workspace:Raycast()) from a Vector3 origin in a Vector3 direction.
Basic Raycast
local rayOrigin = Vector3.new(0, 0, 0)local rayDirection = Vector3.new(0, -100, 0)local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
Filtering
WorldRoot:Raycast() accepts an optional RaycastParams object which tells the raycast to selectively include or exclude certain BaseParts, ignore the Water material for Terrain, or use a collision group.
Key | Description |
---|---|
FilterDescendantsInstances | Array of objects whose descendants are used in filtering raycasting candidates. |
FilterType | Enum.RaycastFilterType enum which determines how the FilterDescendantsInstances array is used in the raycast operation. |
IgnoreWater | Boolean which determines whether the Water material is considered when raycasting against Terrain. |
CollisionGroup | String name of the collision group used for the raycasting operation. |
Raycast Filtering
local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastParams = RaycastParams.new()raycastParams.FilterDescendantsInstances = {script.Parent}raycastParams.FilterType = Enum.RaycastFilterType.ExcluderaycastParams.IgnoreWater = truelocal raycastResult = workspace:Raycast(rayOrigin, rayDirection, raycastParams)
Calculating Direction
When applicable, you can calculate an unknown directional vector (rayDirection) using a known origin and destination. This is useful when casting a ray between two points that can change, such as from one player character to another.
The origin plus a directional vector indicate the ray's destination:
rayOrigin + rayDirection = rayDestination
Subtract rayOrigin from both sides of the equation:
rayOrigin + rayDirection − rayOrigin = rayDestination − rayOrigin
The ray's direction equals the destination minus the origin:
rayDirection = rayDestination − rayOrigin
local rayOrigin = workspace.TestOrigin.Positionlocal rayDestination = workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal raycastResult = workspace:Raycast(rayOrigin, rayDirection)
Detecting Hits
If the raycasting operation hits an eligible BasePart or Terrain cell, a RaycastResult object is returned containing the results. To test for a hit, confirm that the result is not nil and utilize the following properties as needed.
Property | Description |
---|---|
Instance | The BasePart or Terrain cell that the ray intersected. |
Position | Vector3 position of the intersection between the ray and the Instance. |
Distance | Distance between the ray origin and intersection point. |
Material | The Enum.Material of the BasePart or Terrain at the intersection point. |
Normal | Vector3 of the normal vector of the intersected face. |
Raycast Hit Detection
local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastResult = workspace:Raycast(rayOrigin, rayDirection)if raycastResult thenprint("Instance:", raycastResult.Instance)print("Position:", raycastResult.Position)print("Distance:", raycastResult.Distance)print("Material:", raycastResult.Material)print("Normal:", raycastResult.Normal)elsewarn("No raycast result!")end