1개월 전 · Jul 2, 2026 11:30 PM
How Roblox's Camera:WorldToViewportPoint works under the hood:
LUA
local function CustomWorldToScreen(worldPos)
local camera = workspace.CurrentCamera
local cframe = camera.CFrame
local fov = camera.FieldOfView
local viewport = camera.ViewportSize
-- Transform world point to camera relative space
local relPos = cframe:PointToObjectSpace(worldPos)
if relPos.Z >= 0 then return Vector2.new(0, 0), false end -- Behind camera
local aspect = viewport.X / viewport.Y
local fovYRad = math.rad(fov)
local fovXRad = 2 * math.atan(math.tan(fovYRad / 2) * aspect)
local screenX = (viewport.X / 2) * (1 - (relPos.X / (-relPos.Z * math.tan(fovXRad / 2))))
local screenY = (viewport.Y / 2) * (1 + (relPos.Y / (-relPos.Z * math.tan(fovYRad / 2))))
return Vector2.new(screenX, screenY), true
end