0

Adobe After Effects(一个动画/合成应用程序)有一种基于 JavaScript 的脚本语言(表达式),它带有一堆基于 JS 构建的 After Effects 特定功能。功能linear()就是其中之一。它考虑一个对象属性的动画变化(例如,滑块的 X 位置)并将其链接到另一个属性(例如,场景中某个其他对象的旋转),以便第一个动画属性控制/动画第二个财产。

如果该解释令人困惑,请参阅此视频中的 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

1

在许多其他事情中,这是一条直线,非常简单地说大声笑。一个正方形是 4x 线性的,我想你可以这么说。在与声音 (EQ) 一起使用的工具中,它从 0hz 到 20k 是线性的。你在做什么听起来很难。如果 a 和 b 是线,它们会在你的彩球处相遇。球可以向左、向右、向上移动以及你在你的功能中拥有的那些。这让我深思熟虑。还剩下什么?数学术语也是线性的,所以你是对的。我认为

https://www.geeksforgeeks.org/python-linear-programming-in-pulp/

我偶然发现了这个!

抱歉,顺便说一句,我不知道如何使它看起来更好。

于 2019-10-14T02:21:56.930 回答
1

是的,这是一个执行线性插值的函数,某些语言具有lerp()函数或等效函数。但是 javascript Math 类中似乎没有任何内容。

于 2019-10-14T02:41:29.260 回答