【问题标题】:Maya: duplicate AnimCurve in the API/C++Maya:在 API/C++ 中复制 AnimCurve
【发布时间】:2015-07-22 22:13:09
【问题描述】:

是否有任何简单的方法可以复制任何类型的 AnimCurve?我看到使用 MFnAnimCurve 可能会变得非常臃肿。

P.S.:现在使用 Maya 2013。

【问题讨论】:

    标签: maya-api


    【解决方案1】:

    好吧 - 我知道没人在乎,因为这个问题对于 99.9999% 的 c0der 来说是完全不必要的。

    答案是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;
    }
    

    P.S.:您需要实现自己的 MString newName(const MString&amp; oldName)

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多