Seems to be working relative to orientation, however now the position doesn’t seem to be rising properly / at all rising normal instead of just straight ‘upward’ like intened behaviour?
I’m not exactly sure what you’re asking for. If you want the part to go up on the Y axis regardless of the part’s orientation then the code you posted should work fine.
The easiest method is to just multiply with a CFrame.
Doing so applies the transformation relative to the given CFrame.
HitPart.CFrame = HitPart.CFrame * CFrame.new(relativeX, relativeY, relativeZ)
The long axis of cylinders is the X axis, so you’d probably want to transform along X and have Y and Z be 0
Now that you mentioned it, using welds (not WeldConstraints) is probably a lot better in the first place.
For a given weld, weld.Part1.CFrame = weld.Part0.CFrame * weld.C0 * weld.C1:Inverse() holds.
All you’d have to do is set C0 to a CFrame with some X value and 0 for Y and Z.
WeldConstraints do not define a relative position, they only cause the physics solver to physically connect the parts. Manually changing the CFrame of either part causes the constraint to be updated.