_{a}* q

_{b}≠ q

_{b}* q

_{a}

However

^{-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:

_{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:

_{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?

_{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

^{-1}* T = I

_{VQS}, whereas

T * T

_{-1}≠ I

_{VQS}

This seems incorrect; both sould return I

_{VQS}.

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

//-------------------------------------------------------------------------------- // VQS 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()