I am making a morph-giver script. The morph is stored pairs of (DummyBodyPart, MorphToBeWeldedToIt)

The DummyBodyPart is used to make sure that the relative position of the morph to the Character part and the dummy part are the same. I have created a dummy and placed the morph parts in the correct position around it. I have also tied each dummy part to the correct morph and fetched them correctly, etc.

(Here MorphPart would be something like Helmet, CharacterPart would be the roblox player's head, DummyPart would be the Head of a dummy already wearing the morph on it)

I have gotten the positioning down. I just do

MorphPart.Position = MorphPart.Position + (CharacterPart.Position - DummyPart.Position)

So that the relative position of the MorphPart to the DummyPart and the CharacterPart will be the same.

However, rotating the morph part so that the relative rotation is the same is where I seem to be running into a bit of a wall.

My original approach was to

MorphPart.CFrame = MorphPart.CFrame * CFrame.Angles(math.rad(XTurn),math.rad(YTurn),math.rad(ZTurn))

Where XTurn YTurn and ZTurn are Calculated as

local XTurn = CharacterPart.Orientation.X - DummyPart.Orientation.X --(same for Y,Z)

Except this approach doesn't seem to be working at all. At any angle except which the dummy is facing, the morph gets welded completely disoriented. The helmet is welded at some uncanny angle, the backpack is facing inwards, etc.

I have tried using -XTurn, -YTurn etc.... and even using ToWorldSpace (with both +/- X/Y/ZTurn)

But every time, the morph is positioned correctly but each part is rotated wrong. the helmet is welded to the head, but it isn't facing the right way.