我们可以在 LaTeX 中制作动画而不预编译每一帧,即模拟吗?

我们可以在 LaTeX 中制作动画而不预编译每一帧,即模拟吗?

animate包非常适合简单的动画,但它的缺点是动画的每一帧都必须在编译期间创建。对于具有简单动态但循环时间较长(即许多不同的帧)的动画,这会导致较长的编译时间和较大的 PDF 文件。

作为示例,考虑以下 MWE。

\documentclass{article}

\usepackage{tikz}
\usepackage{animate}

\def\bouncerow#1#2{%
  \begin{tikzpicture}[baseline=0pt]
    \def\bounceball##1##2{%
      +(0,{abs(cos( (##2) / (##1) * 180 ))}) circle[radius=.5ex]
    }
    \draw [line cap=round]
      (0,0) \bounceball{1}{#2}
      foreach \n in {2, ..., #1} {
        coordinate (previous)
        ({(\n-1)*1em},0pt) \bounceball{\n}{#2}
        coordinate (this)
        (previous) -- (this)
      };
    % Make the bounding box fixed.
    \path (-1ex,-1ex) rectangle ({(#1 - 1)*1em + 1ex},1cm+1ex);
  \end{tikzpicture}%
}

\begin{document}

Here are some bouncing circles:
\begin{animateinline}[loop, autoplay]{24}%
  \multiframe{144}{r=0+0.0417}{% We need 6*24 = 144 frames here.
    \bouncerow 3\r
  }%
\end{animateinline}

Here are lots of those circles:
\begin{animateinline}[loop, autoplay]{24}%
  \multiframe{216}{r=0+0.0417}{% We would need 2520*24 = 60480 frames for this!
    \bouncerow 9\r
  }%
\end{animateinline}

\end{document}

\bouncerow{n}绘制一排球,球体中心相连,以不同的频率弹跳。第一个球每秒弹跳一次,第二个球每隔一秒弹跳一次,依此类推。因此,第一排的弹跳(周期为 1 秒、2 秒和 3 秒)每 6 秒重复一次。我们可以轻松地为其制作动画。

但是对于第二行,有 9 个球,我们必须准备 42 分钟的动画!这显然是不可行的。

我希望理论上可以在使用 JavaScript 查看动画时进行必要的计算,这样可以消除编译开销并减少生成的 PDF 的文件大小。但是,我找不到任何关于如何执行此操作的文档(我能理解)。通过合理的工作量是否可行?我熟悉 TeX,过去也有一些使用 JavaScript 的经验,所以如果解决方案比较技术性,那也不是问题。


我目前发现的情况:

  • animate有一个编程接口,但似乎仅限于控制预编译的框架。
  • Z 有一个animations库,但根据文档,它目前仅支持 SVG 输出格式。
  • 这个答案使用 JavaScript 与动画进行交互,但这样做显然会创建数以万计的 OCG,这并不比拥有大量帧好。(我不得不承认,由于这个原因,我没有花时间真正理解答案。)
  • 这个答案也可以与 JavaScript 进行一些交互,但没有任何动画。

答案1

正如已经注意到的,pkganimate制作的动画由快速连续播放的静态动画帧组成。与基于 SMIL 的 SVG 动画不同,单个图形对象无法单独制作动画。

根本原因可能是 Adob​​e 定义的 JavaScript for PDF 规范中缺少 Canvas 对象及其 DOM 表示。

因此,pkganimate适合制作相对较短的动画序列。

相关内容