
Download
OffsetCameraPackage.rbxm (171.5 KB)
Contacts
- @solarscuffle_bot - Contact me on Discord for direct communication
- https://discord.gg/QU4MWb8fwK - View the Offset Camera thread
What does this do?

Flexibility
Offset Camera is a flexible, customizable camera that can truly just replace your default camera for all intents and purposes by changing its many Settings. It is desirable for reimplementing Shiftlock seamlessly across all devices, adding replicated torso and head rotations for free to improve player expressiveness, implementing First-Person cameras, Vehicle cameras, Over-The-Shoulder cameras, and more.
Native Support
Offset Camera is a custom camera implemented by attaching itself to pre-existing camera controllers and overriding their functionality. The only camera type supported at the moment is the ClassicCamera or CameraType.Custom camera. This allows it to capture the native feel and maintain seamless support & sensitivity across Mobile, Console, and PC for R6 and R15 avatars.
If your default camera mode is not Custom/Classic, but you still want to use this module, please write a reply explaining your use-case!
A consequence of being so tightly integrated is that the native CameraModule has to be replaced to return its camera instead of an empty table.
This camera will modify Humanoid.AutoRotate every frame, meaning it cannot be set while the camera is enabled.
Installation instructions are left inside the package’s README script.
API
API
function OffsetCamera.isEnabled(): boolean
function OffsetCamera.enable()
function OffsetCamera.disable()
function OffsetCamera.toggle()
To use Offset Camera simply parent it to somewhere the client can access, require the module, and call the OffsetCamera.enable() method. Here was my setup when recording these demos using the Client RunContext:

local OffsetCamera = require(script.OffsetCamera)
OffsetCamera.settings.subjectName = nil -- Focus on the raw humanoid
OffsetCamera.enable()
task.wait(40)
OffsetCamera.disable()
Settings
Settings
Offset Camera has many individual settings that can be changed live.
OffsetCamera.settings = {
-- Set me to the name of a basepart or attachment under the Character or Camera.CameraSubject, and I'll treat that as my focus
subjectName = nil :: string?,
-- Set me to true if you want me to focus on the whole vehicle instead of the subject
centerOnVehicle = false,
-- Set me to 0 if you don't want the camera to rotate with the subject
-- Set me to 1 if you want to rotate entirely with the subject, like following the head as it turns or the shoulder when it wobbles
-- It's best if you redefine the whole table like this instead of changing individual keys
subjectRotationConvergence = {
[Players.LocalPlayer.CameraMinZoomDistance] = 1,
[ZOOM_DEFAULT] = 0,
},
-- Set me to define the camera keypoints at different distances
-- It's best if you redefine the whole table like this instead of changing individual keys
offsets = {
[Players.LocalPlayer.CameraMinZoomDistance] = CFrame.identity,
[3] = CFrame.new(1.75, 0, 0),
},
-- Set me if you want to go from Right-Handed to Left-Handed
mirrorOffsets = false,
-- Set us if you want to make the camera faster or slower in a direction
horizontalSensitivity = 1,
verticalSensitivity = 1,
-- Set me to true if you want the character to bend their head and torso to follow the camera
bendToFollowCamera = true,
-- Change me to change how fast the character bends to face the camera. Slower is more dramatic, faster is snappier.
bendSpeed = 10,
-- Set me to false to let players look past their max yaw without spinning the character around
rotateCharacterYawToFollowCamera = true,
-- Set us to true if you want to restrict how far the camera can turn horizontally when standing or sitting.
-- (Keep us off if your character flings around while seated or platformstanding to prevent nausea, jittery camera corrections, and weird physics beahvior)
restrictCameraByTorsoYawWhenStanding = false,
restrictCameraByTorsoYawWhenSitting = false,
-- Change us to change how far up and down the camera can look, and how far the head & torso will rotate to follow
-- https://www.desmos.com/calculator/tjyrshl4xt This is an interactive graphing calculator you can use to preview the angles
maxHeadPitch = math.rad(80),
minHeadPitch = math.rad(-80),
maxTorsoPitchPercent = 0.625,
minTorsoPitchPercent = 0.5,
torsoPitchWeight = 3,
-- Change us to change how far left and right the camera can look, and how far the head & torso will rotate to follow
maxHeadYaw = math.rad(90),
minHeadYaw = math.rad(-90),
maxTorsoYawPercent = 0.5,
minTorsoYawPercent = 0.5,
torsoYawWeight = 1,
}
Subject Name
A string representing the name of an Attachment, BasePart, or Humanoid found under the Camera.CameraSubject (or its parent, the Character, if its a Humanoid), which is used to compute the Focus of the camera.
If the field is
nilor a descendant with the name can’t be found, it will use theCamera.CameraSubjectitself to compute theFocus. Setting theCamera.CameraSubjectshould work as expected otherwise.
This example set settings.subjectName = "RightKneeRigAttachment":
Offsets
Like the Offsets table, this is a table of [ZoomDistance]: Percent pairs which are cubically interpolated between by the Zoom Distance which is bound between the Player.CameraMinZoomDistance and Player.CameraMaxZoomDistance. This is how you can position and rotate your camera at different zoom distances.

If there are no entries in the table, it will use the
CFrame.identityas an offset from the camera subject.
If the Zoom Distance is less than the minimum pivot’s distance or more than the maximum pivot’s distance, it will clamp to using that pivot.
For stability purposes, only the Roll of an offset is considered. This is how you can add or remove roll to your zoom.
Mirror Offsets
A flag to flip all offsets into their respective “Mirrored” counterparts, by negating the X position and negating the Y and Z angles of each offset. This is intended for games that wish to support Left Handed gameplay but are primarily Right Handed, or vice-versa.
This will not change the
subjectNamesetting, meaning if you are tracking theRightShoulderAttachmentthen this will not change thesubjectNameto theLeftShoulderAttachment.
Subject Rotation Convergences
A table of values between [0, 1], much like the Offsets table above, that lerps between the fixed rotation and subject’s intrinsic rotation. It is used to introduce free camera shake relative to the subject by setting values to 1, and dampen the wobble of the subject by setting values less than 1, useful for nausea accessibility.

For example, if the settings.subjectName = "Head" and at the current distance the SubjectRotationConvergence is 1, then whenever the head rotates from its animation or is rotated otherwise, the camera will follow it to keep it centered.
Some subjects don’t rotate in a meaningful way which nullifies this field, such as settings.subjectName = nil (the Humanoid), or the RootPart, a static part in the workspace, etc.
A value of 0 means to not apply any of the subject’s relative rotation and only use its position. If you don’t want a wobbly experience or want to avoid motion sickness, set your values close to 0.
A value of 1 means to apply all of the subject’s relative rotation. This is useful for intense chase scenes in scary games, or to enhance the immersiveness in casual games like hangouts.
A value between [0, 1] is somewhere in between, letting you tune just how much rotation you truly want at any given distance.
Sensitivity
Artificially increase or decrease the sensitivity of the camera. Useful for situations like scoping down a rifle.
HorizontalSensitivity - Multiplies the horizontal user input by this much.
VerticalSensitivity - Multiplies the vertical user input by this much.
Bend To Follow Camera
When enabled, the character will turn their head and bend their torso to follow the camera. This replicates to other clients using the same angle settings.

Bend Speed
How fast the character will turn their head and bend their torso to match the camera. Slower values like ~10 will add a sense of drama like you might find in a horror game, while higher values like ~30 will feel smooth yet snappy, better for more comical or strategic games.
Max & Min Angles
Pitch is how far up and down the camera is rotated. Yaw is how far left and right the camera is rotated.

MaxHeadPitch/Yaw - Max angle the head can turn before the whole body rotates to compensate.
MinHeadPitch/Yaw - Min angle the head can turn before the whole body rotates to compensate.
MaxTorsoPitch/YawPercent - The percent of the max rotation that will be performed by the torso instead of the head.
MinTorsoPitch/YawPercent - The percent of the min rotation that will be performed by the torso instead of the head.
TorsoPitch/YawWeight - Changes how quickly the torso rotates to catch up.
To only rotate the head, set the MinTorsoPercent, MaxTorsoPercent = 0.
To only rotate the torso, set the MinTorsoPercent, MaxTorsoPercent, TorsoWeight = 1.
Interactive Visualizer of the Head and Torso Angles for Different Parameters
https://www.desmos.com/calculator/tjyrshl4xt
Restrict Camera By Torso When Standing/Sitting
Restrict the ability to turn the camera past the MinHeadYaw or MaxHeadYaw. most useful when driving vehicles in first person.
Enabled:
Disabled:
Rotate Character Yaw To Follow Camera
Disabled:
Enabled:
Center On Vehicle
When sitting in a VehicleSeat or standing on a SkateboardingPlatform the camera will center itself on the vehicle instead of on the original subject.
