This should work, derived it from formula in my CFrame tutorial.
The rotation should occur in any axis however it’s set to the center of part1 to a target point in this case, and the rotation is set at the center of the part1, let me know if you want to change the center of rotation.
It uses world space axis rotation howeverr with a specified axis using CFrame.fromAxisAngles:
--Evaera arrow adornment
--https://gist.github.com/evaera/735f23c67c2c173cfed2955f357b03a3
local function arrow(name, from, to, color, scale, alwaysOnTop : boolean)
if alwaysOnTop == nil then
alwaysOnTop = true
end
color = color or BrickColor.random().Color
scale = scale or 1
if typeof(from) == "Instance" then
if from:IsA("BasePart") then
from = from.CFrame
elseif from:IsA("Attachment") then
from = from.WorldCFrame
end
if to ~= nil then
from = from.p
end
end
if typeof(to) == "Instance" then
if to:IsA("BasePart") then
to = to.Position
elseif to:IsA("Attachment") then
to = to.WorldPosition
end
end
if typeof(from) == "CFrame" and to == nil then
local look = from.lookVector
to = from.p
from = to + (look * -10)
end
if to == nil then
to = from
from = to + Vector3.new(0, 10, 0)
end
assert(typeof(from) == "Vector3" and typeof(to) == "Vector3", "Passed parameters are of invalid types")
local container = workspace:FindFirstChild("Arrows") or Instance.new("Folder")
container.Name = "Arrows"
container.Parent = workspace
local shaft = container:FindFirstChild(name .. "_shaft") or Instance.new("CylinderHandleAdornment")
shaft.Height = (from - to).magnitude - 2
shaft.CFrame = CFrame.lookAt(
((from + to)/2) - ((to - from).unit * 1),
to
)
if shaft.Parent == nil then
shaft.Name = name .. "_shaft"
shaft.Color3 = color
shaft.Radius = 0.15
shaft.Adornee = workspace.Terrain
shaft.Transparency = 0
shaft.Radius = 0.15 * scale
shaft.Transparency = 0
shaft.AlwaysOnTop = alwaysOnTop
shaft.ZIndex = 5 - math.ceil(scale)
end
shaft.Parent = container
local pointy = container:FindFirstChild(name .. "_head") or Instance.new("ConeHandleAdornment")
scale = scale == 1 and 1 or 1.4
if pointy.Parent == nil then
pointy.Name = name .. "_head"
pointy.Color3 = color
pointy.Radius = 0.5 * scale
pointy.Transparency = 0
pointy.Adornee = workspace.Terrain
pointy.Height = 2 * scale
pointy.AlwaysOnTop = alwaysOnTop
pointy.ZIndex = 5 - math.ceil(scale)
end
pointy.CFrame = CFrame.lookAt((CFrame.lookAt(to, from) * CFrame.new(0, 0, -2 - ((scale-1)/2))).p, to)
pointy.Parent = container
if scale == 1 then
arrow(name .. "_backdrop", from, to, Color3.new(0, 0, 0), 2, alwaysOnTop)
end
return shaft, pointy
end
local weld = script.Parent
local part1 = weld.Part1
local targetPoint = workspace.Target
local function worldCFrameRotationToC0ObjectSpace(motor6DJoint,worldCFrame)
local part0 = motor6DJoint.Part0
local c1Store = motor6DJoint.C1
local c0Store = motor6DJoint.C0
local relativeToPart0 = part0.CFrame:inverse() * worldCFrame * c1Store
return relativeToPart0
end
local dt = 0.0001
targetPoint.Position = part1.Position+Vector3.new(0,5,0)
while true do
local rotationAxis = (targetPoint.Position - part1.Position)
arrow("Test", part1, targetPoint.Position, nil, nil, false)
local rotationCFrame = CFrame.fromAxisAngle(rotationAxis.Unit,dt*2.5)
local goalWorldSpaceCFrame = (rotationCFrame*part1.CFrame).Rotation + part1.CFrame.Position
weld.C0 = worldCFrameRotationToC0ObjectSpace(weld, goalWorldSpaceCFrame)
dt = task.wait()
end