Hello, I am working on a system that points the head and upper body in the direction of the camera. Sometimes if you move the camera too fast the head and body stops and doesn’t follow the camera anymore. I have tried to solve it myself, but it does not work. Any help is needed, thanks for reading.
Here is my script:
Script
local neckC0 = CFrame.new(0, 0.8, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local waistC0 = CFrame.new(0, 0.2, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1);
local TweenService = game:GetService("TweenService")
local Time = 0
game.ReplicatedStorage.CameraUpdateEvent.OnServerEvent:Connect(function(player, ytheta, xtheta, aiming, Anglebetween, FM, LM, RM, BM)
wait(0.001)
local neck = player.Character.Head.Neck
local waist = player.Character.UpperTorso.Waist
local head = player.Character.Head
local torso = player.Character.UpperTorso
spawn(function()
Time = Time + 1
local Angle = -xtheta
local LastAngle = xtheta
if -xtheta > 48 then
Angle = LastAngle
else
LastAngle = Angle
end
-- print(Anglebetween)
if aiming == false then
local NeckCFrameTween = TweenService:Create(
neck,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = neckC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, (-xtheta - 0.2), 0)}
)
NeckCFrameTween:Play()
local WaistCFrameTween = TweenService:Create(
waist,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = waistC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, -xtheta, 0)}
)
WaistCFrameTween:Play()
WaistCFrameTween.Completed:Wait()
NeckCFrameTween.Completed:Wait()
-- neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, (-xtheta - 0.2), 0)
-- waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, -xtheta, 0)
elseif aiming == false then
local NeckCFrameTween = TweenService:Create(
neck,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = neckC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, (-xtheta - 0.2), 0)}
)
NeckCFrameTween:Play()
local WaistCFrameTween = TweenService:Create(
waist,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = waistC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, -xtheta, 0)}
)
WaistCFrameTween:Play()
WaistCFrameTween.Completed:Wait()
NeckCFrameTween.Completed:Wait()
Time = 0
-- neck.C0 = neckC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, (-xtheta - 0.2), 0)
-- waist.C0 = waistC0 * CFrame.fromEulerAnglesYXZ(ytheta*0.5, -xtheta, 0)
elseif aiming == true then
local NeckCFrameTween = TweenService:Create(
neck,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = neckC0}
)
local WaistCFrameTween = TweenService:Create(
waist,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = waistC0}
)
NeckCFrameTween:Play()
WaistCFrameTween:Play()
WaistCFrameTween.Completed:Wait()
NeckCFrameTween.Completed:Wait()
print(Time)
Time = 0
end
if Time <= 10 then
print("HFKI")
-- local NeckCFrameTween = TweenService:Create(
-- neck,
-- TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
-- {C0 = neckC0}
-- )
-- local WaistCFrameTween = TweenService:Create(
-- waist,
-- TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
-- {C0 = waistC0}
-- )
-- NeckCFrameTween:Play()
-- WaistCFrameTween:Play()
-- print("Hi, the Time is: "..Time)
-- WaistCFrameTween.Completed:Wait()
-- NeckCFrameTween.Completed:Wait()
---- neck.C0 = neckC0
---- waist.C0 = waistC0
end
end)
-- wait(1)
Time = Time + 1
print(Time)
if Time <= 100000 then
print("HI AND THE TIME IS: "..Time)
if Time/100000 > 2 then
print("AGEAIUHESJHNJKELNDSFKJAEGNAJEGNJDNGNKJWEGNDJLWENFLAK")
local Angle3N = math.sin(neckC0.LookVector.Y/head.CFrame.LookVector.Y)
local Angle3W = math.sin(waistC0.LookVector.Y/torso.CFrame.LookVector.Y)
local NeckCFrameTween = TweenService:Create(
neck,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = neckC0*CFrame.Angles(Angle3N, 0, 0)}
)
local WaistCFrameTween = TweenService:Create(
waist,
TweenInfo.new(0.1,Enum.EasingStyle.Linear,Enum.EasingDirection.In),
{C0 = waistC0*CFrame.Angles(Angle3W, 0, 0)}
)
NeckCFrameTween:Play()
WaistCFrameTween:Play()
WaistCFrameTween.Completed:Wait()
NeckCFrameTween.Completed:Wait()
Time = 0
end
Time = 0
end
end)
Local script
local InputService = game:GetService("UserInputService")
local Player = game.Players.LocalPlayer
local UpperTorso = Player.Character:WaitForChild("UpperTorso")
local Head = Player.Character:WaitForChild("Head")
local RE = game.ReplicatedStorage.CameraUpdateEvent
local Mouse = Player:GetMouse()
local LastAngle = 0
local LookVector
local Opposite
local Angle
local HeadLookVector
local Aiming = false
local ForwardMovement = false
local LeftMovement = false
local RightMovement = false
local BackMovement = false
InputService.InputBegan:Connect(function(key)
if key.KeyCode == Enum.KeyCode.V then --You can change the Key/InputType with another Key/InputType of you choise
Aiming = true
print(key.KeyCode,Aiming)
end
end)
InputService.InputEnded:Connect(function(key)
if key.KeyCode == Enum.KeyCode.V then --You can change the Key/InputType with another Key/InputType of you choise
Aiming = false
print(key.KeyCode,Aiming)
elseif key.KeyCode == Enum.KeyCode.W then
elseif key.KeyCode == Enum.KeyCode.W then
elseif key.KeyCode == Enum.KeyCode.W then
elseif key.KeyCode == Enum.KeyCode.W then
end
end)
game:GetService("RunService").RenderStepped:Connect(function(delta)
local Camera = workspace.CurrentCamera
local Torso = Player.Character.UpperTorso
local HeadLookVector = Player.Character.Head.CFrame.LookVector
local lv = Camera.CFrame.LookVector
local nv = Torso.CFrame.LookVector
LookVector = Camera.CFrame.LookVector
local Adjacent = math.sqrt((LookVector.X^2)+(LookVector.Z^2))
Opposite = LookVector.Y
Angle = math.atan2(Opposite, Adjacent)
HeadLookVector = Head.CFrame.LookVector
RE:FireServer(math.asin(LookVector.y), math.atan(LookVector.x, LookVector.z), Aiming, LookVector:Dot(HeadLookVector), ForwardMovement, LeftMovement, RightMovement, BackMovement)
-- RE:FireServer(math.asin(LookVector.y), Vector3.new(LookVector.x:Dot(LookVector.z)), Aiming)
end)