CFrame isn’t just position – it has a rotation component as well. What you’re doing is telling TweenService to tween the part not just from its current position, but it’s current orientation as well. CFrame.new(px,py,pz) returns a CFrame with a rotation of 0,0,0, and because your part’s rotation is not 0,0,0 to begin with, it tweens between the two rotations.
You need to keep your target CFrame’s orientation the same as the original:
local Pos = part.Pos.Value
local targetCFrame = part.CFrame - part.CFrame.p + Pos
TweenService:Create(part, tweenInfo, {CFrame = targetCFrame}):Play()
- part.CFrame.p subtracts the current position component from the CFrame, making it only rotation. Then we add a new position component, creating a CFrame with the rotation of the original and position of the new.