CAMorph Manual
A
CAMorph
represents a morph of a
CAPoseMorphTag
. It allows access to the internally stored data and can apply this data to the host object. The class is defined in the
lib_ca.h
header file.
CAMorph elements are stored in a CAPoseMorphTag ,见 CAPoseMorphTag Manual .
// This example loops through all morphs of the given // CAPoseMorphTag and prints the morph name.// print morph name ApplicationOutput ( "Morph: " + morph-> GetName ()); }
CAMorph elements are created and deleted using the parent CAPoseMorphTag ,见 CAPoseMorphTag Manual .
// This example adds a new morph to the given CAPoseMorphTag. poseMorphTag->ExitEdit(doc, false ); CAMorph * const morph = poseMorphTag->AddMorph(); if (morph == nullptr ) return maxon::OutOfMemoryError( MAXON_SOURCE_LOCATION ); morph-> SetName ( "New Morph" ); poseMorphTag->UpdateMorphs();The data stored in one CAMorph can be copied from a CAMorph to another CAMorph :
// get active morph const Int32 activeIndex = poseMorphTag->GetActiveMorphIndex(); CAMorph * const activeMorph = poseMorphTag->GetMorph(activeIndex); if (activeMorph == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// create new morph CAMorph * const morph = poseMorphTag->AddMorph(); if (morph == nullptr ) return maxon::OutOfMemoryError( MAXON_SOURCE_LOCATION );
// copy morph morph-> CopyFrom (activeMorph, nullptr , CAMORPH_COPY_FLAGS::NONE ); const String newName = activeMorph-> GetName () + " Copy" ; morph-> SetName (newName);
// set new morph as active morph const Int32 newIndex = poseMorphTag->GetMorphIndex(morph); poseMorphTag->SetActiveMorphIndex(newIndex); poseMorphTag->UpdateMorphs();
The internal data and several properties of a CAMorph can be edited through dedicated functions. But some properties can only be edited through the parent CAPoseMorphTag when the morph is selected. See 特性 .
Every CAMorph has a name:
Every CAMorph has an internal ID:
A morph can be applied as a post-deform morph ( ID_CA_POSE_MIXING_DEFORMED ). If this is the case can be checked with:
The actual morph data is stored internally in CAMorphNode elements. See CAMorphNode Manual .
To edit or access data stored in a CAMorph one must switch the morph to a certain mode:
Valid flags are:
The data modes are:
// get active morph const Int32 activeIndex = poseMorphTag->GetActiveMorphIndex(); CAMorph * const morph = poseMorphTag->GetMorph(activeIndex); if (morph == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); CAMorphNode * const mnode = morph-> GetFirst (); if (mnode == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// expand data to access it const CAMORPH_MODE_FLAGS expandFlags = CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::EXPAND ; morph-> SetMode (doc, poseMorphTag, expandFlags, CAMORPH_MODE::ABS );
// check stored data if (mnode-> GetInfo () & CAMORPH_DATA_FLAGS::POINTS ) { // access point data const Int32 pointCount = mnode-> GetPointCount (); for ( Int32 i = 0; i < pointCount; ++i) { const 向量 point = mnode-> GetPoint (i); ApplicationOutput ( "Point: " + String::VectorToString (point)); } }
// collapse data const CAMORPH_MODE_FLAGS collapseFlags = CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::COLLAPSE ; morph-> SetMode (doc, poseMorphTag, collapseFlags, CAMORPH_MODE::AUTO ); poseMorphTag->UpdateMorphs();
A CAMorph can use an object as a reference:
// create new morph CAMorph * const morph = poseMorphTag->AddMorph(); if (morph == nullptr ) return maxon::OutOfMemoryError( MAXON_SOURCE_LOCATION );
// set given object as target morph-> SetTarget (poseMorphTag, doc, targetObject);
// set new morph as active morph const Int32 newIndex = poseMorphTag->GetMorphIndex(morph); poseMorphTag->SetActiveMorphIndex(newIndex); poseMorphTag->UpdateMorphs(); const Int32 index = poseMorphTag->GetMorphIndex(morph); poseMorphTag->SetActiveMorphIndex(index); poseMorphTag->SetParameter( ID_CA_POSE_MIXING , ID_CA_POSE_MIXING_ABS , DESCFLAGS_SET::NONE );
The strength of a CAMorph controls how strongly it is applied to the host object.
// get index of active morph const Int32 activeMorphIndex = poseMorphTag->GetActiveMorphIndex();
// loop through all morphs const Int32 morphCount = poseMorphTag->GetMorphCount(); for ( Int32 i = 0; i < morphCount; ++i) { CAMorph * const morph = poseMorphTag->GetMorph(i); if (morph == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// set morph strength if (activeMorphIndex != i) morph-> SetStrength (0.0); else morph-> SetStrength (1.0); } poseMorphTag->UpdateMorphs(doc);
The data stored in a CAMorph can be read from the host object and applied back to the host object:
The flags used to control what data is stored or applied are defined in CAMORPH_DATA_FLAGS . These flags are also used with CAMorphNode::GetInfo() ,见 CAMorphNode Manual .
// get first morph CAMorph * const morph = poseMorphTag->GetMorph(1); if (morph) { morph-> 应用 (doc, poseMorphTag, CAMORPH_DATA_FLAGS::ALL ); }