You can write your topic however you want, but you need to answer these questions:
1. What do you want to achieve? Keep it simple and clear!
Understanding of how to convert a lookvector position to degrees.
-
What is the issue? Include screenshots / videos if possible!
I saw a video where the persons shows how you can make your characters head follow your camera.
The final script is this:
local camera = workspace.CurrentCamera
local character = game.Players.LocalPlayer.Character
local root = character:WaitForChild("HumanoidRootPart")
local neck = character:FindFirstChild("Neck", true)
local yOffset = neck.C0.Y
local CFNew, CFAng, asin = CFrame.new, CFrame.Angles, math.asin
game:GetService("RunService").RenderStepped:Connect(function()
local cameraDirection = root.CFrame:toObjectSpace(camera.CFrame).lookVector
if neck then
neck.C0 = CFNew(0 , yOffset, 0) * CFAng(0, -asin(cameraDirection.x), 0) * CFAng(asin(cameraDirection.y), 0, 0)
end
end)
I don’t understand how they convert the lookvectors position to degrees.
To convert the position to degrees you have to do -asin(cameraDirection.x) and asin(cameraDirection.y) I get why you have to use asin since arcsine of opposite/hypotenuse=the angle of a right-angled triangle. Or opposite/1 (1 since magnitude of lookvector is one I think) or just the opposite, but how do you find out what the opposite site is and how does it work in 3d space when the unit circle is in 2d space?
-
What solutions have you tried so far? Did you look for solutions on the Developer Hub?
I have searched around on trigonometry on the roblox devforum but I couldn’t find anything on lookvectors and how to convert it to degrees etc.
1 Like
What rig type are you using? R6 or R15?
This is from part two of the video
local tweenService = game:GetService("TweenService")
local Camera = workspace.CurrentCamera
local Player = game.Players.LocalPlayer
local Character = Player.Character
local Root = Character:WaitForChild("HumanoidRootPart")
local Neck = Character:FindFirstChild("Neck", true)
local YOffset = Neck.C0.Y
local CFNew, CFAng = CFrame.new, CFrame.Angles
local asin = math.asin
game:GetService("RunService").RenderStepped:Connect(function()
local CameraDirection = Root.CFrame:toObjectSpace(Camera.CFrame).lookVector
if Neck then
if Character.Humanoid.RigType == Enum.HumanoidRigType.R15 then
Neck.C0 = CFNew(0, YOffset, 0) * CFAng(0, -asin(CameraDirection.x), 0) * CFAng(asin(CameraDirection.y), 0, 0)
elseif Character.Humanoid.RigType == Enum.HumanoidRigType.R6 then
Neck.C0 = CFNew(0, YOffset, 0) * CFAng(3 * math.pi/2, 0, math.pi) * CFAng(0, 0, -asin(CameraDirection.x)) * CFAng(-asin(CameraDirection.y), 0, 0)
end
end
end)
game.ReplicatedStorage.Look.OnClientEvent:Connect(function(otherPlayer, neckCFrame)
local Neck = otherPlayer.Character:FindFirstChild("Neck", true)
if Neck then
tweenService:Create(Neck, TweenInfo.new(.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out, 0, false, 0), {C0 = neckCFrame}):Play()
end
end)
while wait(1) do
game.ReplicatedStorage.Look:FireServer(Neck.C0)
end
Make a RemoteEvent in replicated storage.Then make a script in serverscript service
game.ReplicatedStorage.Look.OnServerEvent:Connect(function(player, neckCFrame)
for key, value in pairs(game.Players:GetChildren()) do
if value ~= player and (value.Character.Head.Position - player.Character.Head.Position).Magnitude < 10 then
game.ReplicatedStorage.Look:FireClient(value, player, neckCFrame)
end
end
end)