Quaternion concatenation is noncommutative. That is
qa * qb ? qb * qa
However
q-1 * q = q * q-1 = Iq
where q-1 is the inverse of q and Iq is the identity quaternion. VQS concatenation is also noncommutative:
TA_B * TB_C ? TB_C * TA_B
Where TA_B represents a VQS transformation. Now, we find the inverse of TA_B like so:
TA_B-1 = TB_A
My question is, is the concatenation of a VQS with its inverse commutative? Ie, is the following statement correct?
TA_B * TB_A = TB_A * TA_B = IVQS
Where IVQS is the identity VQS. With the implementation I’m using I’m finding
T -1 * T = IVQS, whereas
T * T -1 ? IVQS
This seems incorrect; both sould return IVQS.
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()