3

这样的事情背后的数学是什么?C++ 视角。

在此处输入图像描述

此MSDN 页面上的更多示例。

更新:被问到一个更具体的问题。Penner 的补间^的数学/动画理论是什么?你是怎么想出这些公式的?它们基于什么数学原理?

我和数学,我们不是好朋友!我正在FLOAT为我正在编写的 UI 开发一个多值动画师,我想知道从本地 C++ 程序员的角度来看,生成这样一个轨迹的数学原理是什么。

谷歌搜索并找到了代码,但我也在从编程的角度寻找一些理论......不仅仅是代码或纯数学。我可以从网上找到我需要的代码,但我想在这个过程中理解它。就像这个允许人们尝试使用缓动函数生成器的站点一样。

我也可以使用Windows 动画管理器 (如果事情变得血腥,我可能会使用),但它在单个float. 并且仅仅为 RGB 设置动画需要单独为每个 FLOAT 设置动画。它导致巨大的代码膨胀......非常糟糕。

如果有人有一些提示,我将非常感激。我主要从编程的角度寻找理论。最终目标是编写一堆不同的动画算法,可以在一段时间或速度等内将一组 FLOAT 从其初始值动画到目标值。

该计划不仅是编写代码,还包括了解其背后发生的事情。然后也许可以用这个动画来创造……除非这些被证明是一些严格的标准数学函数。

4

2 回答 2

4

所以想想补间函数的要求。

  1. 该函数应表示两个位置/状态之间的有效平滑运动。对于那些没有读过本书相关部分的人来说,这意味着f应该是一个连续和可微的函数,使得f(0) == 0f(1) == 1; 实际运动是使用它作为基元构建的。
  2. “Ease”(在动画补间意义上)意味着“导数为零”;这给出了运动以零速度开始和/或结束(即静止)的效果。所以“ease-in”的意思是f'(0) == 0“ease-out”的意思f'(1) == 0

其他一切都是基于审美考虑。

三次曲线(例如 Bezier/Hermite 样条)之所以流行,部分原因是它们可以让您控制曲线两端的位置和切线(速度),还因为它们接近于柔性梁在约束时采用的自然形状它的位置它在几个点。立方体形状使弯曲梁的内应力最小化。(不出所料,这些木梁被船舶设计师和其他起草人称为“样条线”,因为这是我们得到这个词的地方。)

从历史上看,手绘卡通动画师总是根据经验根据感觉指定他们的补间。关键动画师在他们的关键图纸旁边绘制一个图表(称为“时序图”;在您最喜欢的图像搜索引擎上查找),它告诉中间人应该如何对中间单元进行计时。

然而,相机运动(平移、缩放、旋转)是另一回事。布局/动画艺术家指定了运动的开始和结束(使用场图指定)、运动发生的帧数、关于缓动的说明以及布局/动画团队认为重要的任何其他内容(例如,如果您有“逗留”)。

需要计算的实际运动;观众会注意到如果旋转的一帧超出了百分之几度。进行这些计算是相机部门工作的一部分。

Brian Salt 有一本很棒的书,叫做“基本动画支架技术”,可以追溯到物理动画相机的时代,并详细描述了他们必须做的事情,以及在多大程度上。如果你对这些东西感兴趣,我推荐它。

于 2014-02-17T01:57:26.823 回答
2

数学就是数学。

一个关于Riemann Sum的好教程将演示这个概念。

在基础编程中,您有一个数学方程式,它为给定的 X(时间)生成 Y 值(高度)。周期性地,例如每秒一次,您插入一个新的 X(时间)值并返回高度。

您评估此函数的次数越多,分辨率就越好(这就是黎曼和和微积分图表的用武之地)。你会得到的最好的是看起来像楼梯台阶的曲线 的近似值。

在嵌入式系统中,没有很多资源可以非常频繁地评估这样的功能。可以使用线段来近似曲线。线段越多,近似值越好(提高准确性)。所以一种方法是将曲线分解成线段。对于给定的 x,对直线使用适当的线性公式。与评估更高次方程相比,评估一条线通常需要更少的资源。

您的曲线通常是从物理方程生成的。所以你不仅需要提高数学,还应该提高物理。

否则,您可以在网上搜索处理轨迹的库。

当我们更接近硬件时,可以使用计时器来调用评估给定 X 的轨迹函数的方法。计时器有助于产生更准确的时间值。

在网上搜索“曲线拟合算法”、“Bresenham 算法”、“图形碰撞检测算法”

于 2014-02-16T18:48:19.743 回答