CFrame is impossible to make sword sheathe in the right position

I have a script that welds a sword sheathe on the player but it’s impossible for me to get it in the right spot with CFrame.

image
This is the position of the sheathe to the player that I want to accomplish

image
But I spent all night and a long time trying to position it right with CFrame but it won’t be in the right position. I know which numbers will change the object in certain positions but whenever I change the angles it seems the positioning all gets messed up. Any help would be appreciated.

local sheathe_equip,repstorage = {},game:GetService(“ReplicatedStorage”)

function sheathe_equip:weld_sheathe(cap,arm)

local weld = Instance.new("Weld")
weld.Parent = cap 
weld.C0 = CFrame.new(0.2,-1,1) * CFrame.Angles(-5,60,1)
weld.Part0 = cap
weld.Part1 = arm

end

function sheathe_equip:equip_sheathe(char)

local arm = char:WaitForChild("Left Arm")
local lower,cap = repstorage.assets.sheathe.Lower,repstorage.assets.sheathe.cap
lower.Parent = char
cap.Parent = char
self:weld_sheathe(cap,arm)

end

function sheathe_equip:run(player)
local char = player.Character or player.CharacterAdded:Wait()
sheathe_equip:equip_sheathe(char)
end

return sheathe_equip

Use WeldConstraints over Welds. You also want to make the model massless for this.

It looks like you are manually inputting the CFrame values to position in the weld in the correct position. If you are using this way an good method would be to use an attachment to visually position it like so:

https://devforum.roblox.com/t/need-help-on-c0-cframe-rotation/911900/8?u=dthecoolest

Then you can just copy the orientation and position of the attachment into two separate CFrame values and combine them through CFrame multiplication.

This method is helpful with meshes as the front face and UpVector may not always aligned accordingly depending on how it’s modeled.

Or if you don’t need to manipulate the C0 you can use a @Tom_atoes idea of using a weld constraint.