Roblox camera
Give your AI coding agent a Roblox brain. Curated skills for Roblox Studio development.
npx -y skills add TabooHarmony/roblox-brain --skill roblox-cameraAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 18 stars18 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when scripting Roblox camera behavior, CFrame placement, screen raycasts, first or third-person views, or cutscenes.
SKILL.md
2.9 KB, as published. Nobody here has run it
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:
CFrame.new(pos)
CFrame.lookAt(at, lookAt, up?) -- preferred over deprecated CFrame.new(pos, lookAt)
CFrame.Angles(rx, ry, rz) -- XYZ Euler (radians)
cf * Vector3.new(0, 0, 10) -- local offset → world
cf:Lerp(goal, alpha) -- 0..1 linear interp
cf.LookVector / RightVector / UpVector -- world-space unit axes
Custom camera loop — always RenderStepped, never Heartbeat:
camera.CameraType = Enum.CameraType.Scriptable
RunService.RenderStepped: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 actual raycast.
Pitfalls:
- Client-only. Server sets silently dropped.
- Without
Scriptable, defaults overwrite your CFrame every frame. RenderSteppedfor camera (visual sync).Heartbeatadds 1-frame lag.Camera.CFramelacks VR head rotation — useGetRenderCFrame()for 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.