//-***************************************************************************** double XformOp::getZRotation() const { ABCA_ASSERT( m_type == kRotateOperation || m_type == kRotateZOperation, "Meaningless to get rotation angle from non-rotation op." ); if ( m_type == kRotateZOperation ) { return m_channels[0]; } else { Abc::M44d m; Abc::V3d rot; m.makeIdentity(); m.setAxisAngle( this->getVector(), DegreesToRadians( m_channels[3] ) ); Imath::extractEulerXYZ( m, rot ); return RadiansToDegrees( rot[2] ); } }
//-***************************************************************************** Abc::M44d XformSample::getMatrix() const { Abc::M44d ret; ret.makeIdentity(); for ( std::size_t i = 0 ; i < m_ops.size() ; ++i ) { Abc::M44d m; m.makeIdentity(); XformOp op = m_ops[i]; XformOperationType otype = op.getType(); if ( otype == kMatrixOperation ) { for ( std::size_t j = 0 ; j < 4 ; ++j ) { for ( std::size_t k = 0 ; k < 4 ; ++k ) { m.x[j][k] = op.getChannelValue( ( 4 * j ) + k ); } } } else if ( otype == kRotateXOperation ) { m.setAxisAngle( Abc::V3d( 1.0, 0.0, 0.0 ), DegreesToRadians( op.getChannelValue( 0 ) ) ); } else if ( otype == kRotateYOperation ) { m.setAxisAngle( Abc::V3d( 0.0, 1.0, 0.0 ), DegreesToRadians( op.getChannelValue( 0 ) ) ); } else if ( otype == kRotateZOperation ) { m.setAxisAngle( Abc::V3d( 0.0, 0.0, 1.0 ), DegreesToRadians( op.getChannelValue( 0 ) ) ); } else { Abc::V3d vec( op.getChannelValue( 0 ), op.getChannelValue( 1 ), op.getChannelValue( 2 ) ); if ( otype == kScaleOperation ) { m.setScale( vec ); } else if ( otype == kTranslateOperation ) { m.setTranslation( vec ); } else if ( otype == kRotateOperation ) { m.setAxisAngle( vec, DegreesToRadians( op.getChannelValue( 3 ) ) ); } } ret = m * ret; } return ret; }