Atoms Crowd  7.0.0
Shear6< T > Class Template Reference

#include <ImathShear.h>

Public Types

typedef T BaseType
 

Public Member Functions

ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 T & operator[] (int i)
 Element access.
 
constexpr ATOMSMATH_HOSTDEVICE const T & operator[] (int i) const
 Element access.
 
template<class S >
ATOMSMATH_CONSTEXPR14 Shear6 (const Vec3< S > &v)
 
template<class S >
ATOMSMATH_CONSTEXPR14 Shear6 (const Shear6< S > &h)
 
template<class S >
ATOMSMATH_CONSTEXPR14 const Shear6< T > & operator= (const Vec3< S > &v)
 
template<class S >
void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY)
 
template<class S >
void setValue (const Shear6< S > &h)
 
template<class S >
void getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const
 
template<class S >
void getValue (Shear6< S > &h) const
 
template<class S >
constexpr bool operator== (const Shear6< S > &h) const
 
template<class S >
constexpr bool operator!= (const Shear6< S > &h) const
 
Constructors and Assignment
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 ()
 Initialize to 0.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (T XY, T XZ, T YZ)
 Initialize to the given XY, XZ, YZ values.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (const Vec3< T > &v)
 Initialize to the given XY, XZ, YZ values held in (v.x, v.y, v.z)
 
template<class S >
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (const Vec3< S > &v)
 Initialize to the given XY, XZ, YZ values held in (v.x, v.y, v.z)
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY)
 Initialize to the given (XY XZ YZ YX ZX ZY) values.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (const Shear6 &h)
 Copy constructor.
 
template<class S >
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 Shear6 (const Shear6< S > &h)
 Construct from a Shear6 object of another base type.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator= (const Shear6 &h)
 Assignment.
 
template<class S >
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator= (const Vec3< S > &v)
 Assignment from vector.
 
 ~Shear6 ()=default
 Destructor.
 
Compatibility with Sb
template<class S >
ATOMSMATH_HOSTDEVICE void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY)
 Set the value.
 
template<class S >
ATOMSMATH_HOSTDEVICE void setValue (const Shear6< S > &h)
 Set the value.
 
template<class S >
ATOMSMATH_HOSTDEVICE void getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const
 Return the values.
 
template<class S >
ATOMSMATH_HOSTDEVICE void getValue (Shear6< S > &h) const
 Return the value in h
 
ATOMSMATH_HOSTDEVICE T * getValue ()
 Return a raw pointer to the array of values.
 
ATOMSMATH_HOSTDEVICE const T * getValue () const
 Return a raw pointer to the array of values.
 
Arithmetic and Comparison
template<class S >
constexpr ATOMSMATH_HOSTDEVICE bool operator== (const Shear6< S > &h) const
 Equality.
 
template<class S >
constexpr ATOMSMATH_HOSTDEVICE bool operator!= (const Shear6< S > &h) const
 Inequality.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 bool equalWithAbsError (const Shear6< T > &h, T e) const
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 bool equalWithRelError (const Shear6< T > &h, T e) const
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator+= (const Shear6 &h)
 Component-wise addition.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator+ (const Shear6 &h) const
 Component-wise addition.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator-= (const Shear6 &h)
 Component-wise subtraction.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator- (const Shear6 &h) const
 Component-wise subtraction.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator- () const
 Component-wise multiplication by -1.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6negate ()
 Component-wise multiplication by -1.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator*= (const Shear6 &h)
 Component-wise multiplication.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator*= (T a)
 Scalar multiplication.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator* (const Shear6 &h) const
 Component-wise multiplication.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator* (T a) const
 Scalar multiplication.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator/= (const Shear6 &h)
 Component-wise division.
 
ATOMSMATH_HOSTDEVICE ATOMSMATH_CONSTEXPR14 const Shear6operator/= (T a)
 Scalar division.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator/ (const Shear6 &h) const
 Component-wise division.
 
constexpr ATOMSMATH_HOSTDEVICE Shear6 operator/ (T a) const
 Scalar division.
 

Static Public Member Functions

constexpr static ATOMSMATH_HOSTDEVICE unsigned int dimensions ()
 Return the number of dimensions, i.e. 6.
 
Numerical Limits
constexpr static ATOMSMATH_HOSTDEVICE T baseTypeLowest () noexcept
 Largest possible negative value.
 
constexpr static ATOMSMATH_HOSTDEVICE T baseTypeMax () noexcept
 Largest possible positive value.
 
constexpr static ATOMSMATH_HOSTDEVICE T baseTypeSmallest () noexcept
 Smallest possible positive value.
 
constexpr static ATOMSMATH_HOSTDEVICE T baseTypeEpsilon () noexcept
 Smallest possible e for which 1+e != 1.
 

Public Attributes

Direct access to members
xy
 
xz
 
yz
 
yx
 
zx
 
zy
 

Detailed Description

template<class T>
class Shear6< T >

Shear6 class template.

A shear matrix is technically defined as having a single nonzero off-diagonal element; more generally, a shear transformation is defined by those off-diagonal elements, so in 3D, that means there are 6 possible elements/coefficients:

| X' |   |  1  YX  ZX  0 |   | X |
| Y' |   | XY   1  ZY  0 |   | Y |
| Z' | = | XZ  YZ   1  0 | = | Z |
| 1  |   |  0   0   0  1 |   | 1 |

X' =      X + YX * Y + ZX * Z
Y' = YX * X +      Y + ZY * Z
Z` = XZ * X + YZ * Y +      Z

See https://www.cs.drexel.edu/~david/Classes/CS430/Lectures/L-04_3DTransformations.6.pdf

Those variable elements correspond to the 6 values in a Shear6. So, looking at those equations, "Shear YX", for example, means that for any point transformed by that matrix, its X values will have some of their Y values added. If you're talking about "Axis A has values from Axis B added to it", there are 6 permutations for A and B (XY, XZ, YX, YZ, ZX, ZY).

Not that Maya has only three values, which represent the lower/upper (depending on column/row major) triangle of the matrix. Houdini is the same as Maya (see https://www.sidefx.com/docs/houdini/props/obj.html) in this respect.

There's another way to look at it. A general affine transformation in 3D has 12 degrees of freedom - 12 "available" elements in the 4x4 matrix since a single row/column must be (0,0,0,1). If you add up the degrees of freedom from Maya:

  • 3 translation
  • 3 rotation
  • 3 scale
  • 3 shear

You obviously get the full 12. So technically, the Shear6 option of having all 6 shear options is overkill; Imath/Shear6 has 15 values for a 12-degree-of-freedom transformation. This means that any nonzero values in those last 3 shear coefficients can be represented in those standard 12 degrees of freedom. Here's a python example of how to do that:

import imath M = imath.M44f() s = imath.V3f() h = imath.V3f() r = imath.V3f() t = imath.V3f()

# Use Shear.YX (index 3), which is an "extra" shear value

M.setShear((0,0,0,1,0,0))

M44f((1, 1, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1))

M.extractSHRT(s, h, r, t)

1

s

V3f(1.41421354, 0.707106769, 1)

h

V3f(1, 0, 0)

r

V3f(0, -0, 0.785398185)

t

V3f(0, 0, 0)

That shows how to decompose a transform matrix with one of those "extra" shear coefficients into those standard 12 degrees of freedom. But it's not necessarily intuitive; in this case, a single non-zero shear coefficient resulted in a transform that has non-uniform scale, a single "standard" shear value, and some rotation.

So, it would seem that any transform with those extra shear values set could be translated into Maya to produce the exact same transformation matrix; but doing this is probably pretty undesirable, since the result would have some surprising values on the other transformation attributes, despite being technically correct.

This usage of "degrees of freedom" is a bit hand-wavey here; having a total of 12 inputs into the construction of a standard transformation matrix doesn't necessarily mean that the matrix has 12 true degrees of freedom, but the standard translation/rotation/scale/shear matrices have the right construction to ensure that.

Member Typedef Documentation

◆ BaseType

template<class T >
typedef T Shear6< T >::BaseType

The base type: In templates that accept a parameter V (could be a Color4), you can refer to T as V::BaseType

Member Function Documentation

◆ equalWithAbsError()

template<class T >
ATOMSMATH_CONSTEXPR14 bool Shear6< T >::equalWithAbsError ( const Shear6< T > &  h,
e 
) const
inline

Compare two shears and test if they are "approximately equal":

Returns
True if the coefficients of this and h are the same with an absolute error of no more than e, i.e., for all i abs (this[i] - h[i]) <= e

◆ equalWithRelError()

template<class T >
ATOMSMATH_CONSTEXPR14 bool Shear6< T >::equalWithRelError ( const Shear6< T > &  h,
e 
) const
inline

Compare two shears and test if they are "approximately equal":

Returns
True if the coefficients of this and h are the same with a relative error of no more than e, i.e., for all i abs (this[i] - h[i]) <= e * abs (this[i])

The documentation for this class was generated from the following file: