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

T * T

^{-1}* T = I_{VQS}, whereasT * 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()