I am slightly confused about the CFrame.Angles constructor. Is CFrame.Angles(x, y, z)
the same thing as CFrame.Angles(x, 0, 0) * CFrame.Angles(0, y, 0) * CFrame.Angles(0, 0, z)
? From what I know and have, it should be the same thing because the multiplication operator offsets one CFrame from another CFrame. However, from what I tested so far, the X-component, for some reason, adds up with the Z-component, so it isn’t the same thing.
Let me clarify myself. This following line just rotates the CFrame of the block by 90 degrees.
-- part is the green part, and root is the spaceship on the bottom
part.CFrame = root.CFrame * CFrame.Angles(0, math.pi / 2, 0) *
CFrame.new(0, 10, 0)
Now, if I change the X-component to 30 degrees, It weirdly offsets Z-orientation.
part.CFrame = root.CFrame * CFrame.Angles(math.pi / 6, math.pi / 2, 0) *
CFrame.new(0, 10, 0)
Now if I do add a Z-orientation of -30 degrees, the 30 degrees from the X-orientation adds up with -30 degrees from the Z-orientation to cancel each other out.
part.CFrame=root.CFrame * CFrame.Angles(math.pi/6, math.pi/2, -math.pi/6)*
CFrame.new(0, 10, 0)
Well, Z-orientation is 0.

But multiplying CFrames created using CFrame.Angles gives me more of what I was looking for.
part.CFrame = root.CFrame * CFrame.Angles(0, math.pi / 2, 0) *
CFrame.Angles(math.pi / 6, 0, 0) * CFrame.new(0, 10, 0)
Can someone can explain to me what the CFrame.Angles(x, y, z) really does, and why the X only changes Z? No matter how hard I try, I can’t seem to offset X- and Y-orientation with a single CFrame.Angles() because Z gets offset instead of X. I have already tried changing Z only, but that changes Z, not X.