Weld it to the HumanoidRootPart instead of the Head for a more accurate experience. The majority of your character work should be based around the root part.
Anyway. Should be as simple as creating the part and welding it to the player.
local fogProxy = Instance.new("Part")
fogProxy.Name = "FogPart"
fogProxy.BrickColor = BrickColor.new("Fog")
fogProxy.Size = Vector3.new(1, 1, 1)
fogProxy.Anchored = false
fogProxy.CanCollide = false
fogProxy.Massless = true
local fogMesh = Instance.new("SpecialMesh")
fogMesh.MeshId = "rbxassetid://1185246" -- Needed to invert the sphere
fogMesh.Scale = Vector3.new(-500, -500, -500)
fogMesh.Parent = fogProxy
local fogWeld = Instance.new("Weld")
fogWeld.Part0 = fogMesh
fogWeld.Part1 = Character.HumanoidRootPart -- Up to you to correct this
fogWeld.Parent = fogWeld.Part0
fogProxy.Parent = Character
The sphere needs to be inverted so that the player actually sees the sphere, otherwise without inversion the player will be in the sphere and thus will not be able to see it.
WeldConstraints will weld in place, whereas other types of welds will snap at each part’s origin if not explicitly set. For this case, you’ll want a regular weld instead so you can avoid weird behaviours and the need to set position. Also, stay away from the parent argument of Instance.new.