Hello,
I'm doing some pretty nasty camera manipulation, where It's supposed to work kinda like this https://i.imgur.com/3WSf9qP.png
The camera is above and behind the player, looking at a point that's in front of the player. When you hold down right click, both the camera and where it's looking at should rotate around the player's center (HumanoidRootPart), just like the default ROBLOX camera.
This is what i've got so far:
wait(0.5)
local Settings = UserSettings()
local GameSettings = Settings.GameSettings
GameSettings.RotationType = Enum.RotationType.MovementRelative
print("Disabling default camera")
script.Parent.CameraScript.Disabled = true -- Disable default camera
print("Default Camera disabled.")
------------------------------------------------------------------------------
local cplayer = script.Parent.Parent -- current player
local cam = game.Workspace.CurrentCamera -- current camera
local runSvc = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService") -- input service
local m2dn = false -- mouse 2 down
cplayer.Character.Humanoid.AutoRotate = false -- set auto rotate to false
local Player = game.Players.LocalPlayer --get the local player
local Mouse = Player:GetMouse() --get the mouse
local rx=0
local ry=0
Mouse.Button2Down:connect(function()
m2dn=true
end)
Mouse.Button2Up:connect(function()
m2dn=false
end)
UserInputService.InputChanged:connect(function(inputObject)
if inputObject.UserInputType == Enum.UserInputType.MouseMovement and m2dn then
rx=rx+inputObject.Delta.x
ry=ry+inputObject.Delta.y
end
end)
local right = false
local function Update()
local hRootPart = cplayer.Character.HumanoidRootPart -- makes job easier
local playerPos = hRootPart.Position
local targetAim = Vector3.new(0,1,-5) -- the offset where the camera aims
local targetPos = Vector3.new(0,10,5) -- offset of where the actual camera is
local objCamPos = hRootPart.CFrame:toObjectSpace(cam.CFrame) -- camera position
local Aim = objCamPos.LookVector -- where the camera is currently aiming
local Pos = objCamPos.Position -- where the camera is currently at (x,y,z)
ry = math.clamp(ry,-20,60) -- limit values
if (rx<-360)then
rx=0
elseif (rx>360) then
rx=0
end
local ang = CFrame.Angles(math.rad(ry),math.rad(rx),0) -- calculate angles to rotate by
targetPos = (ang*CFrame.new(targetPos)).Position -- transform position
targetAim = (ang*CFrame.new(targetAim)).Position -- transform aim area
local AimDiff = targetAim-Aim -- difference in where the camera is actually aiming vs where it's supposed to be
local PosDiff = targetPos-Pos -- same as above but for position
Aim=Aim+(AimDiff/2) -- smooth values to create a sliding effect
Pos=Pos+(PosDiff/2)
Aim = hRootPart.CFrame:toWorldSpace(CFrame.new(Aim)).Position --modify where the camera will be next
Pos = hRootPart.CFrame:toWorldSpace(CFrame.new(Pos)).Position
cam.CoordinateFrame = CFrame.new(Pos,Aim) -- actually move the camera
end
runSvc:BindToRenderStep("Camera",Enum.RenderPriority.Camera.Value,Update)
While it does roughly work, there's some issues where it doesn't always rotate around the center point like I want it to.
I've tried changing the way angles are processed in many ways but i've had no success in getting the results I need.
Anyone have any ideas?
Thanks in advance,
dylanpdx
