• Advertisement

# Is the concatenation of a VQS with its inverse commutative?

This topic is 1675 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

## Recommended Posts

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


#### Share this post

##### Share on other sites
Advertisement

Yes, you should get the identity in both cases. Can you post a specific example where you don't get that? Simple numbers would be best, so we can do the computations by hand...

#### Share this post

##### Share on other sites

Ok good idea. Here's an example that might help. Incidentally, the issue it seems appears to be with the Inverse(VQS) function. Here's a test case:

T = [(-3.2, 1.6, -10.3) , (-0.52, 0.68, 0.49, 0.32) , 2]

Inverse( Inverse(T) ) = [(-4.0, 2.5, -9.9) , (-0.52, 0.68, 0.49, 0.32) , 2]

Inverse( Inverse(T) ) should return T. The scalar and quaternion components are correct, however the translation vector is off. It looks like the method to find the inverse translation component might be incorrect.

#### Share this post

##### Share on other sites

SOLVED.

Solution was to ensure all quaternions were normalized, thus representing rotations.

#### Share this post

##### Share on other sites

Just to let you know just because your quaternions are normalized does not mean they represent rotation. Quaternion can be used for other things other than rotation.

In the graphics world, it is used mostly for that. But in reality they can be used for other things other than rotation.

#### Share this post

##### Share on other sites

• Advertisement
• Advertisement
• ### Popular Tags

• Advertisement
• ### Popular Now

• 11
• 20
• 10
• 11
• 12
• Advertisement