scipy.spatial.transform.RigidTransform.

inv#

RigidTransform.inv(self)#

Invert this transform.

Composition of a transform with its inverse results in an identity transform.

A rigid transform is a composition of a rotation and a translation, where the rotation is applied first, followed by the translation. So the inverse transform is equivalent to the inverse translation followed by the inverse rotation.

Returns:
RigidTransform instance

The inverse of this transform.

Examples

>>> from scipy.spatial.transform import RigidTransform as Tf
>>> from scipy.spatial.transform import Rotation as R
>>> import numpy as np

A transform composed with its inverse results in an identity transform:

>>> rng = np.random.default_rng(seed=123)
>>> t = rng.random(3)
>>> r = R.random(rng=rng)
>>> tf = Tf.from_components(t, r)
>>> tf.as_matrix()
array([[-0.45431291,  0.67276178, -0.58394466,  0.68235186],
       [-0.23272031,  0.54310598,  0.80676958,  0.05382102],
       [ 0.85990758,  0.50242162, -0.09017473,  0.22035987],
       [ 0.        ,  0.        ,  0.        ,  1.        ]])
>>> (tf.inv() * tf).as_matrix()
array([[[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]]])

The inverse rigid transform is the same as the inverse translation followed by the inverse rotation:

>>> t, r = tf.as_components()
>>> r_inv = r.inv()  # inverse rotation
>>> t_inv = -t  # inverse translation
>>> tf_r_inv = Tf.from_rotation(r_inv)
>>> tf_t_inv = Tf.from_translation(t_inv)
>>> np.allclose((tf_r_inv * tf_t_inv).as_matrix(),
...             tf.inv().as_matrix(),
...             atol=1e-12)
True
>>> (tf_r_inv * tf_t_inv * tf).as_matrix()
array([[[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]]])