How would I get the Vector3 position from the middle of the screen?

I am trying to essentially get the position in the 3D space of the center of your screen, similar to Mouse.hit.p but always locked in the center.

1 Like

You’re looking for Camera:ScreenPointToRay. Here’s the documentation:

A quick implementation (given that the current documentation is a bit dated and uses the legacy FindPartOnRay):

local currentCamera = workspace.CurrentCamera

local raycastParams = RaycastParams.new()
-- raycastParams.FilterDescendantsInstances = { character } <-- fill this in yourself

local VIEWPORT_SIZE = currentCamera.ViewportSize -- current size of the screen -- if you're raycasting multiple times, this will have to be redefined!
local CAST_LENGTH = 1000 -- distance to raycast

local unitRay = currentCamera:ScreenPointToRay(VIEWPORT_SIZE.X / 2, VIEWPORT_SIZE.Y / 2 + game:GetService("GuiService"):GetGuiInset().Y) -- account for the 36px TopBar inset
local raycastResult = workspace:Raycast(unitRay.Origin, unitRay.Direction * CAST_LENGTH, raycastParams)
if raycastResult and raycastResult.Position then -- .Position is the Vector3 (the Hit.Position) of the center of the screen
	-- example operation:
	local part = Instance.new("Part")
    part.Anchored = true
    part.Size = Vector3.new(1, 1, 1)
    part.CFrame = CFrame.new(raycastResult.Position)
    part.Parent = workspace
end

Hope this solves your problem.

10 Likes

Works perfectly! Thank you so much.

I made a few edits to it because you should be accounting for the CoreGui inset and some of my math was a bit sloppily done (and, uh… incorrect). The code now should create an accurate representation of the middle of the screen not including the Topbar, but if what I created before works well enough, so be it!

I’d encourage you to take a look at it, however. Happy scripting.

2 Likes