Developer knowledge network · moderated exchange

UnreliableCode қауымдастығы

Әзірлеушілерді зерттеу, кері инженерия және кодтау қауымдастығы

Knowledge indexТірі
4Categories
919Threads
2.8KЖазбалар
Guide

Reading Camera.CFrame & computing custom 3D to 2D projection in Luau

matrix_math_guy
Math Specialist
MEMBER
Өкіл: 105
Қосылу күні: Aug 2018
Хабарламалар: 52
Рахмет: 41
1 ай бұрын · Jul 2, 2026 11:30 PM
#1

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
luau_hacker
Luau Expert
MEMBER
Өкіл: 159
Қосылу күні: Aug 2020
Хабарламалар: 17
Рахмет: 26
1 ай бұрын · Jul 3, 2026 2:50 AM
#2

Mathematical projection matches Roblox's internal C++ implementation within 0.01 pixels. Great work!

raycast_ryan
Ballistics Dev
MEMBER
Өкіл: 72
Қосылу күні: Sep 2019
Хабарламалар: 32
Рахмет: 16
1 ай бұрын · Jul 3, 2026 1:46 PM
#3

PointToObjectSpace handles camera rotation matrix cleanly.