Let’s say I have a GameObject
A with a child
B has a local position
B.localPosition and local rotation
B.localRotation. Now let’s say I want to modify the forward axis of
B such that it gets rotated by some new Quaternion
c so that it points in rotation
To achieve this, I want to modify the rotation of
A Instead of directly modifying the rotation of
B. How would I calculate the necessary rotation to set to
A to achieve this?
My guess would be:
(A.rotation * B.localRotation) * c = d. I know
d. However, I’m not sure how to calculate
A.rotation given the non-commutative property and ordering of quaternion multiplication.
Well, quaternions are always relative rotations, always. When we used them as “absolute” rotations, it just means it relatively rotates from a given initial rotation.
A.rotation * B.localRotation is the same as
B.rotation since B.localRotation is a child of A. So if your “d” is a worldspace orientation, all you need is to calculate the difference between B.rotation and “d”. This difference can simply be applied to A.rotation
Something like this:
var q = d * Quaternion.Inverse(B.rotation);
Here q is the relative worldspace rotation that is required to rotate B from its current worldspace orientation to the new one. This relative rotation can be applied to A to achieve the same effect, since A and B are part of the same kinematic chain. So any relative rotation change that is applied to A will also be applied to B.
A.rotation = q * A.rotation;
Will orient A such that B.rotation == d.