openalea.phenomenal.calibration.transformations

Homogeneous Transformation Matrices and Quaternions.

A library for calculating 4x4 matrices for translating, rotating, reflecting, scaling, shearing, projecting, orthogonalizing, and superimposing arrays of 3D homogeneous coordinates as well as for converting between rotation matrices, Euler angles, and quaternions. Also includes an Arcball control object and functions to decompose transformation matrices.

Author:

Christoph Gohlke

Organization:

Laboratory for Fluorescence Dynamics, University of California, Irvine

Version:

2015.07.18

Requirements

Notes

The API is not stable yet and is expected to change between revisions.

This Python code is not optimized for speed. Refer to the transformations.c module for a faster implementation of some functions.

Documentation in HTML format can be generated with epydoc.

Matrices (M) can be inverted using numpy.linalg.inv(M), be concatenated using numpy.dot(M0, M1), or transform homogeneous coordinate arrays (v) using numpy.dot(M, v) for shape (4, *) column vectors, respectively numpy.dot(v, M.T) for shape (*, 4) row vectors (“array of points”).

This module follows the “column vectors on the right” and “row major storage” (C contiguous) conventions. The translation components are in the right column of the transformation matrix, i.e. M[:3, 3]. The transpose of the transformation matrices may have to be used to interface with other graphics systems, e.g. with OpenGL’s glMultMatrixd(). See also [16].

Calculations are carried out with numpy.float64 precision.

Vector, point, quaternion, and matrix function arguments are expected to be “array like”, i.e. tuple, list, or numpy arrays.

Return types are numpy arrays unless specified otherwise.

Angles are in radians unless specified otherwise.

Quaternions w+ix+jy+kz are represented as [w, x, y, z].

A triple of Euler angles can be applied/interpreted in 24 ways, which can be specified using a 4 character string or encoded 4-tuple:

Axes 4-string: e.g. ‘sxyz’ or ‘ryxy’

  • first character : rotations are applied to ‘s’tatic or ‘r’otating frame

  • remaining characters : successive rotation axis ‘x’, ‘y’, or ‘z’

Axes 4-tuple: e.g. (0, 0, 0, 0) or (1, 1, 1, 1)

  • inner axis: code of axis (‘x’:0, ‘y’:1, ‘z’:2) of rightmost matrix.

  • parity : even (0) if inner axis ‘x’ is followed by ‘y’, ‘y’ is followed by ‘z’, or ‘z’ is followed by ‘x’. Otherwise odd (1).

  • repetition : first and last axis are same (1) or different (0).

  • frame : rotations are applied to static (0) or rotating (1) frame.

Other Python packages and modules for 3D transformations and quaternions:

References

  1. Matrices and transformations. Ronald Goldman. In “Graphics Gems I”, pp 472-475. Morgan Kaufmann, 1990.

  2. More matrices and transformations: shear and pseudo-perspective. Ronald Goldman. In “Graphics Gems II”, pp 320-323. Morgan Kaufmann, 1991.

  3. Decomposing a matrix into simple transformations. Spencer Thomas. In “Graphics Gems II”, pp 320-323. Morgan Kaufmann, 1991.

  4. Recovering the data from the transformation matrix. Ronald Goldman. In “Graphics Gems II”, pp 324-331. Morgan Kaufmann, 1991.

  5. Euler angle conversion. Ken Shoemake. In “Graphics Gems IV”, pp 222-229. Morgan Kaufmann, 1994.

  6. Arcball rotation control. Ken Shoemake. In “Graphics Gems IV”, pp 175-192. Morgan Kaufmann, 1994.

  7. Representing attitude: Euler angles, unit quaternions, and rotation vectors. James Diebel. 2006.

  8. A discussion of the solution for the best rotation to relate two sets of vectors. W Kabsch. Acta Cryst. 1978. A34, 827-828.

  9. Closed-form solution of absolute orientation using unit quaternions. BKP Horn. J Opt Soc Am A. 1987. 4(4):629-642.

  10. Quaternions. Ken Shoemake. http://www.sfu.ca/~jwa3/cmpt461/files/quatut.pdf

  11. From quaternion to matrix and back. JMP van Waveren. 2005. http://www.intel.com/cd/ids/developer/asmo-na/eng/293748.htm

  12. Uniform random rotations. Ken Shoemake. In “Graphics Gems III”, pp 124-132. Morgan Kaufmann, 1992.

  13. Quaternion in molecular modeling. CFF Karney. J Mol Graph Mod, 25(5):595-604

  14. New method for extracting the quaternion from a rotation matrix. Itzhack Y Bar-Itzhack, J Guid Contr Dynam. 2000. 23(6): 1085-1087.

  15. Multiple View Geometry in Computer Vision. Hartley and Zissermann. Cambridge University Press; 2nd Ed. 2004. Chapter 4, Algorithm 4.7, p 130.

  16. Column Vectors vs. Row Vectors. http://steve.hollasch.net/cgindex/math/matrix/column-vec.html

Examples

>>> alpha, beta, gamma = 0.123, -1.234, 2.345
>>> origin, xaxis, yaxis, zaxis = [0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]
>>> I = identity_matrix()
>>> Rx = rotation_matrix(alpha, xaxis)
>>> Ry = rotation_matrix(beta, yaxis)
>>> Rz = rotation_matrix(gamma, zaxis)
>>> R = concatenate_matrices(Rx, Ry, Rz)
>>> euler = euler_from_matrix(R, 'rxyz')
>>> numpy.allclose([alpha, beta, gamma], euler)
True
>>> Re = euler_matrix(alpha, beta, gamma, 'rxyz')
>>> is_same_transform(R, Re)
True
>>> al, be, ga = euler_from_matrix(Re, 'rxyz')
>>> is_same_transform(Re, euler_matrix(al, be, ga, 'rxyz'))
True
>>> qx = quaternion_about_axis(alpha, xaxis)
>>> qy = quaternion_about_axis(beta, yaxis)
>>> qz = quaternion_about_axis(gamma, zaxis)
>>> q = quaternion_multiply(qx, qy)
>>> q = quaternion_multiply(q, qz)
>>> Rq = quaternion_matrix(q)
>>> is_same_transform(R, Rq)
True
>>> S = scale_matrix(1.23, origin)
>>> T = translation_matrix([1, 2, 3])
>>> Z = shear_matrix(beta, xaxis, origin, zaxis)
>>> R = random_rotation_matrix(numpy.random.rand(3))
>>> M = concatenate_matrices(T, R, Z, S)
>>> scale, shear, angles, trans, persp = decompose_matrix(M)
>>> numpy.allclose(scale, 1.23)
True
>>> numpy.allclose(trans, [1, 2, 3])
True
>>> numpy.allclose(shear, [0, math.tan(beta), 0])
True
>>> is_same_transform(R, euler_matrix(axes='sxyz', *angles))
True
>>> M1 = compose_matrix(scale, shear, angles, trans, persp)
>>> is_same_transform(M, M1)
True
>>> v0, v1 = random_vector(3), random_vector(3)
>>> M = rotation_matrix(angle_between_vectors(v0, v1), vector_product(v0, v1))
>>> v2 = numpy.dot(v0, M[:3,:3].T)
>>> numpy.allclose(unit_vector(v1), unit_vector(v2))
True

Functions

affine_matrix_from_points(v0, v1[, shear, ...])

Return affine transform matrix to register two point sets.

angle_between_vectors(v0, v1[, directed, axis])

Return angle between vectors.

arcball_constrain_to_axis(point, axis)

Return sphere point perpendicular to axis.

arcball_map_to_sphere(point, center, radius)

Return unit sphere coordinates from window coordinates.

arcball_nearest_axis(point, axes)

Return axis, which arc is nearest to point.

clip_matrix(left, right, bottom, top, near, far)

Return matrix to obtain normalized device coordinates from frustum.

compose_matrix([scale, shear, angles, ...])

Return transformation matrix from sequence of transformations.

concatenate_matrices(*matrices)

Return concatenation of series of transformation matrices.

decompose_matrix(matrix)

Return sequence of transformations from transformation matrix.

euler_from_matrix(matrix[, axes])

Return Euler angles from rotation matrix for specified axis sequence.

euler_from_quaternion(quaternion[, axes])

Return Euler angles from quaternion for specified axis sequence.

euler_matrix(ai, aj, ak[, axes])

Return homogeneous rotation matrix from Euler angles and axis sequence.

identity_matrix()

Return 4x4 identity/unit matrix.

inverse_matrix(matrix)

Return inverse of square transformation matrix.

is_same_transform(matrix0, matrix1)

Return True if two matrices perform same transformation.

orthogonalization_matrix(lengths, angles)

Return orthogonalization matrix for crystallographic cell coordinates.

projection_from_matrix(matrix[, pseudo])

Return projection plane and perspective point from projection matrix.

projection_matrix(point, normal[, ...])

Return matrix to project onto plane defined by point and normal.

quaternion_about_axis(angle, axis)

Return quaternion for rotation about axis.

quaternion_conjugate(quaternion)

Return conjugate of quaternion.

quaternion_from_euler(ai, aj, ak[, axes])

Return quaternion from Euler angles and axis sequence.

quaternion_from_matrix(matrix[, isprecise])

Return quaternion from rotation matrix.

quaternion_imag(quaternion)

Return imaginary part of quaternion.

quaternion_inverse(quaternion)

Return inverse of quaternion.

quaternion_matrix(quaternion)

Return homogeneous rotation matrix from quaternion.

quaternion_multiply(quaternion1, quaternion0)

Return multiplication of two quaternions.

quaternion_real(quaternion)

Return real part of quaternion.

quaternion_slerp(quat0, quat1, fraction[, ...])

Return spherical linear interpolation between two quaternions.

random_quaternion([rand])

Return uniform random unit quaternion.

random_rotation_matrix([rand])

Return uniform random rotation matrix.

random_vector(size)

Return array of random doubles in the half-open interval [0.0, 1.0).

reflection_from_matrix(matrix)

Return mirror plane point and normal vector from reflection matrix.

reflection_matrix(point, normal)

Return matrix to mirror at plane defined by point and normal vector.

rotation_from_matrix(matrix)

Return rotation angle and axis from rotation matrix.

rotation_matrix(angle, direction[, point])

Return matrix to rotate about axis defined by point and direction.

scale_from_matrix(matrix)

Return scaling factor, origin and direction from scaling matrix.

scale_matrix(factor[, origin, direction])

Return matrix to scale by factor around origin in direction.

shear_from_matrix(matrix)

Return shear angle, direction and plane from shear matrix.

shear_matrix(angle, direction, point, normal)

Return matrix to shear by angle along direction vector on shear plane.

superimposition_matrix(v0, v1[, scale, usesvd])

Return matrix to transform given 3D point set into second point set.

translation_from_matrix(matrix)

Return translation vector from translation matrix.

translation_matrix(direction)

Return matrix to translate by direction vector.

unit_vector(data[, axis, out])

Return ndarray normalized by length, i.e. Euclidean norm, along axis.

vector_norm(data[, axis, out])

Return length, i.e. Euclidean norm, of ndarray along axis.

vector_product(v0, v1[, axis])

Return vector perpendicular to vectors.

Classes

Arcball([initial])

Virtual Trackball Control.