どのタイプの AnimCurve も簡単にコピーする方法はありますか? MFnAnimCurve を使用すると、かなり肥大化する可能性があります。
PS: 現在 Maya 2013 を使用しています。
どのタイプの AnimCurve も簡単にコピーする方法はありますか? MFnAnimCurve を使用すると、かなり肥大化する可能性があります。
PS: 現在 Maya 2013 を使用しています。
わかりました - この問題は、すべての c0der の 99.9999% にとってまったく不要なので、誰も気にしないことはわかっていました。
答えはNO
です。
これは私が選んだ API/C++ ソリューションです。
bool copyAnimCurve(MFnDependencyNode &srcDN, MFnDependencyNode &destDN, MObject &destNode)
{
MFnAnimCurve s( srcDN.object() ), d;
MAngle a; double w;
destNode = d.create( s.animCurveType() );
destDN.setObject( destNode );
if ( !destNode.isNull() )
{
bool unitless( s.isUnitlessInput() ), weighted( s.isWeighted() );
d.setName( newName( s.name() ) );
d.setIsWeighted( weighted );
d.setPreInfinityType( s.preInfinityType() );
d.setPostInfinityType( s.postInfinityType() );
// copy keys...
MFnAnimCurve::TangentType tt[2];
for ( uint i = 0; i < s.numKeys(); ++i )
{
tt[ true ] = s.inTangentType( i );
tt[ false ] = s.outTangentType( i );
if ( unitless )
d.addKey( s.unitlessInput( i ), s.value( i ), tt[ true ], tt[ false ] );
else
d.addKey( s.time( i ), s.value( i ), tt[ true ], tt[ false ] );
// tangents and weights are locked by default - so let's unlock them before setting any values!
d.setTangentsLocked( i, false );
d.setWeightsLocked( i, false );
for ( int j=1; j>=0; --j ) if ( tt[ bool( j ) ] == MFnAnimCurve::TangentType::kTangentFixed )
{
// tangents are internally stored using angle and weights - so we'll only use those.
s.getTangent( i, a, w, bool( j ) );
d.setTangent( i, a, w, bool( j ) );
}
d.setWeightsLocked( i, s.weightsLocked( i ) );
d.setTangentsLocked( i, s.tangentsLocked( i ) );
d.setIsBreakdown( i, s.isBreakdown( i ) );
}
return true;
}
cerr << "\nERROR CREATING AnimCurve COPY OF " << srcDN.name() << endl;
return false;
}
PS: 独自の を実装する必要がありますMString newName(const MString& oldName)
。