Quaternion concatenation is noncommutative. That is

q_{a} * q_{b} ≠ q_{b} * q_{a}

However

q^{-1} * q = q * q^{-1} = I_{q}

where q^{-1} is the inverse of q and I_{q} is the identity quaternion. VQS concatenation is also noncommutative:

T_{A_B} * T_{B_C} ≠ T_{B_C} * T_{A_B}

Where T_{A_B} represents a VQS transformation. Now, we find the inverse of T_{A_B} like so:

T_{A_B}^{-1} = T_{B_A}

My question is, **is the concatenation of a VQS with its inverse commutative?** Ie, is the following statement correct?

T_{A_B }* T_{B_A} = T_{B_A} * T_{A_B} = I_{VQS}

Where I_{VQS} is the identity VQS. With the implementation I’m using I’m finding

T^{ -1} * T = I_{VQS}, whereas

T * T^{ -1} ≠ I_{VQS}

This seems incorrect; both sould return I_{VQS}.

EDIT:

Here is the implementation of VQS Inverse and concatenation functions I'm using:

//-------------------------------------------------------------------------------- // Concatenation //-------------------------------------------------------------------------------- VQS VQS::operator*(const VQS& rhs) const { VQS result; //Combine translation vectors result.v = q.Rotate(rhs.v) * s + v; //Combine quaternions result.q = q * rhs.q; //Combine scales result.s = s * rhs.s; //Return result return result; } //End: VQS::operator*() //-------------------------------------------------------------------------------- // Returns inverse VQS //-------------------------------------------------------------------------------- VQS Inverse(const VQS& other) { VQS temp; //Inverse scale temp.s = 1.0f / other.s; //Inverse quaternion temp.q = Inverse(other.q); //Inverse vector temp.v = temp.q.Rotate(-other.v) * temp.s; return temp; } //End: Inverse()