OmniGraph rotate to orientation behaving strangely for minor movements

I have an action graph that rotates an object to look at the camera. I use Rotate to Orientation fed from Get Look At Rotation. As I move around the objects, they turn back towards the camera, but occasionally do a full rotation first. Watching some of the rotation values, they flip from values like180 to -180 for slight movements. It happens multiple times as I move around the target object.

Before movement:

After slight sideways movement of camera (interestingly this one has z of zero):

Another minor movement example, before:

After:

Is there any way to stop this flipping around?

I posted a video on Discord.

Yes I see. Let me see if I can find out for you.

Ok I asked the experts and they knew what it was straight away. We have seen this before. It is where the object gets very very close to “0 degrees” or on a “pure” axis. This is a problem with programming angles in XYZ Euler and not quaternion.

Euler Angles · UnityTipsRedux (gitbooks.io)

Beyond this I cannot help much more.

Thank you for chasing it up. Could you pass a feature request to the core team - add quaternion input support for Rotate To Orientation.

Note: Normally “orientation” is a quaternion (e.g., xformOp:orient is a quaternion, Get Look At Rotation output has Rotate XYZ vector3 and “Orientation” quatd4 – except Rotate to Orientation has an input of Target Orientation that is a vector3).

Zero angles I think will be somewhat common as looking from a flat angle will mean the Z rotation is normally zero (or ±180). E.g., walking around a target and use it to target the camera will frequently be at eye level I think.

Workaround: Set the rotation speed to something much higher than the frame rate - then you don’t notice! ;-)

We already support this I think. You can add a 4 way matrix to any object.

That would be convenient, but unfortunately does not seem to be the case. The docs says its vectord[3] Rotate To Orientation — Omniverse Extensions latest documentation , Action Graph window hover says vectord[3] (screenshot below), and I tried both quaternion and matrix4 - the Action Graph window would not let me connect them. (I tried using nodes like Make Transformation Matrix from TRS to generate a matrixd[4] transform. They won’t connect via the Action Graph window.)

This is one painful thing in OpenUSD - multiple ways to specify a transform makes life harder for tools.

Gimbal lock does not always matter. In this case, because it visually animates from the current orientation to the new orientation, it does matter.