Developer knowledge network · moderated exchange

Społeczność UnreliableCode

Badania programistów, inżynieria wsteczna i społeczność programistów

Knowledge indexNa żywo
4Categories
919Threads
2.8KPosty
Guide

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

matrix_math_guy
Math Specialist
MEMBER
Rozpustnik: 105
Data dołączenia: Aug 2018
Posty: 52
Dzięki: 41
1 miesięcy temu · 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
Rozpustnik: 159
Data dołączenia: Aug 2020
Posty: 17
Dzięki: 26
1 miesięcy temu · 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
Rozpustnik: 72
Data dołączenia: Sep 2019
Posty: 32
Dzięki: 16
1 miesięcy temu · Jul 3, 2026 1:46 PM
#3

PointToObjectSpace handles camera rotation matrix cleanly.