@tabooharmony/roblox-camera
Use when scripting Roblox camera behavior, CFrame placement, screen raycasts, first or third-person views, or cutscenes.
| name | roblox-camera |
| description | Use when scripting Roblox camera behavior, CFrame placement, screen raycasts, first or third-person views, or cutscenes. |
| last_reviewed | 2026-06-29 |
| sources | https://create.roblox.com/docs/reference/engine/classes/Camera, https://create.roblox.com/docs/reference/engine/enums/CameraType, https://create.roblox.com/docs/reference/engine/datatypes/CFrame |
Roblox Camera
When to Load
Load when scripting custom camera behavior (cutscenes, third-person follow, custom rotation), manipulating CFrame for placement/rotation, raycasting from the screen, or building a non-default player view. Client-only.
Quick Reference
The Camera: workspace.CurrentCamera: one per client. Set CameraType = Scriptable to disable defaults and take full control. Without it, defaults overwrite your CFrame every frame.
CameraType: Fixed, Attach/Watch/Track/Follow (subject-following), Custom (default), Scriptable (no default), Orbital (fixed Y, rotates around player). CameraSubject cannot be nil: setting it reverts.
Key properties: CFrame, CameraSubject, FieldOfView (deg), FieldOfViewMode (Vertical/Diagonal), NearPlaneZ, ViewportSize, HeadLocked, HeadScale, Focus.
CFrame essentials:
| Operation | Luau |
|---|---|
| Position only | CFrame.new(position) |
| Look at target | CFrame.lookAt(position, target, upVector) |
| XYZ rotation | CFrame.Angles(rx, ry, rz) |
| Local to world | cf * Vector3.new(0, 0, 10) |
| Interpolate | cf:Lerp(goal, alpha) |
| Unit axes | cf.LookVector, cf.RightVector, cf.UpVector |
Custom camera loop: always PreRender, never Heartbeat:
camera.CameraType = Enum.CameraType.Scriptable
RunService.PreRender:Connect(function(dt)
local desired = CFrame.lookAt(head.Position - offset, head.Position)
camera.CFrame = camera.CFrame:Lerp(desired, math.min(dt * 10, 1))
end)
Raycasting from camera: camera:ScreenPointToRay(mx, my) (accounts for GUI inset) vs camera:ViewportPointToRay(mx, my) (raw, NO inset). ScreenPointToRay returns a unit Ray (1 stud); multiply Direction by length for the actual raycast.
Pitfalls:
- Client-only. Server sets silently dropped.
- Without
Scriptable, defaults overwrite your CFrame every frame. PreRenderfor camera (visual sync).Heartbeatadds 1-frame lag.RenderSteppedstill works but is superseded byPreRender.Camera.CFramelacks VR head rotation; useGetRenderCFrame()for the true view.SetRollis outdated; apply roll viaCFrame.Angles(0, 0, roll)on CFrame.CameraSubject = nilreverts to previous.CFrame.new(pos, lookAt)is legacy (back-compat only); useCFrame.lookAt(at, lookAt)for new code.ScreenPointToRay≠ViewportPointToRay(GUI inset). UseScreenPointToRayfor mouse input.
See references/full.md for first/third-person recipes, cutscenes, screen shake, mouse-look, full API.
Loading...
Select a file to preview
Analyzing security...
Checking scan reports and verification data.
Bill of Materials
Everything this skill can do — files, network, commands, and more.