0

Adobe After Effects (アニメーション/合成アプリ) には、JavaScript に基づくスクリプト言語 (式) があり、JS の上に構築された一連の After Effects 固有の関数が付属しています。関数linear()はこれらの 1 つです。1 つのオブジェクトのプロパティ (スライダーの X 位置など) のアニメーション化された変化を考慮し、それを別のプロパティ (シーン内の他のオブジェクトの回転など) にリンクして、最初のアニメーション化されたプロパティが 2 番目のプロパティを制御/アニメーション化するようにします。財産。

その説明がわかりにくい場合は、このビデオの 11:33 を参照してください: https://www.youtube.com/watch?v=gK1Ejt7qND0&t=693s

関数呼び出しは次のlinear()ようになります。

linear(ref, refStart, refEnd, outStart, outEnd);

実際の内部引数名が何であるかはわかりませんが、これは彼らがすることです:

ref== 「コントローラー」プロパティ (前の例では、オブジェクトの X 位置)。通常はアニメーションで、時間とともに変化します。

refStart/ refEnd== ref プロパティの下限と上限

outStart/ outEnd== 宛先プロパティの下限と上限 (前の例では、別のオブジェクトの回転)

この関数の機能を表す一般的なプログラミング用語はありますか? それとも数学用語?私が知る限り、それは「補間」、おそらく線形補間に関係するものですが、よくわかりません。

この関数に相当する一般的なプログラミング/数学ライブラリはありますか? After Effects には、 、、 とlinear()呼ばれるの簡易バージョンもあります。私が知る限り、それらはプログラミングでは「イージング関数」と呼ばれるかもしれませんが、よくわかりません。ease()easeIn()easeOut()

おまけ: AE の linear() をゼロからリバース エンジニアリングしてみました。かなりベアボーンであり、型チェックやエラーは行いませんが、それ以外は AE での私のテストでは同じように動作するようです:

function fauxLinear( ref, refStart, refEnd, outStart, outEnd ) {
    // constrain refTemp to range of refStart to refEnd
    let refTemp = 0;
    const refMin = Math.min( refStart, refEnd );
    const refMax = Math.max( refStart, refEnd );

    refTemp =   (ref < refMin) ? refMin :
                (ref > refMax) ? refMax : ref;

    // calculate input range and ref proportion
    const refRange = Math.abs( refStart - refEnd ) || .001; // avoid dbz
    const refRangeTarget = Math.abs( refMin - refTemp );
    const refProportion = refRangeTarget / refRange;

    // calculations for final output
    let outRange = [], outSlope = [], finalVal = [];
    const loopLen = ( Array.isArray( outStart ) ) ? outStart.length : 1;
    if (loopLen == 1) { outStart = [outStart], outEnd = [outEnd]; }

    for (let i = 0; i < loopLen; i++) {
        outRange[i] = Math.abs( outStart[i] - outEnd[i] );
        outSlope[i] = ( outStart[i] <= outEnd[i] ) ? 1 : -1;
        finalVal[i] = ( outSlope[i] * (outRange[i] * refProportion) + outStart[i] );
    }

    return ( loopLen == 1 ) ? finalVal[0] : finalVal;
}
4

2 に答える 2