How do quats work?

You probably don’t want to modify your quat with Yaw, Pitch, and Roll at all. I’m pretty sure those are just abstractions to make quats easier to work with, but it introduces the exact same problem by having it still act like an FRotator.

You actually want to transform the quat itself. You store your ship’s orientaiton as a quat. And then when you have roll, pitch, yaw inputs, you transform the quat around the appropriate axes.

I’ve done this before with the GLM library, but the principle is the same.

So for roll, for example, this may work in Unreal:

MyQuat *= FQuat(FRotator(0.f, 0.f, RollAmount));

I’m creating a Quat from a rotator, and transforming my current ship’s quat by the quat that gives roll. And you do the same for pitch and yaw.

Actually I just double checked your code again and it looks like you’re basically doing just that. Maybe there are ways to optimize it a little by not converting between rotators and quats so much.

The thing is though, you say your yaw and roll change at the same time, and that seems about right. FRotator(Rotation2D.X, Rotation2D.Y, Rotation2D.Y*0.5);

The yaw and roll are both derived from the same value here. I’m not entirely sure why you’re trying to get roll from rotation2D.y*.5 but that may be why it’s happening. In fact, if the game is 3D, why have a Rotation2D of some sort at all.