用于创建 2d 和 3d 的高质量物理动画和模拟的 FOSS 工具

计算科学 软件
2021-12-11 13:42:19

如果我想创建一个高质量的图形来说明我通常与 或 一起使用的科学概念tikz实验但是,这是针对静态内容的。这两种工具都非常强大,可以提供高质量的结果。此外,还有一个庞大的示例数据库、非常好的文档以及围绕这些项目的庞大、活跃的用户社区。 pgfplotspstricks

创建物理动画或模拟的“等效”是什么?

我想从 2d 和 3d 动画和模拟开始,如下页所示(但可能看起来质量更高一些):

然后在我知道如何使用它时继续处理更复杂的事情。

那么你会为这项任务推荐什么,为什么?我在 python 方面有一点背景,所以我更喜欢这个,但如果有一个“杀手工具”,那么从头开始学习一门新语言是可以的。以下是要求:

  • 免费和开源(FOSS),应该在 linux 上运行
  • 它应该是一个很好的界面,可以从上面引用的三个网站重新创建示例(有可能使事情变得更复杂)
  • 就像 tikz 一样,在静态内容的情况下,应该有良好的文档和庞大的活跃用户群
  • 我需要 2d 和 3d 的东西

关于动画和模拟之间的区别,我认为应该没有区别,因为对于模拟,我必须首先求解微分方程(使用另一个库,例如 numpy/scipy),然后对数据进行动画处理。因此,对于这个问题,可以将“模拟”一词简化为“动画”(或者我是否忽略了一些东西?)。

当然我为此搜索过,但问题是我得到了一个很长的包列表,我不知道从哪里开始。对于静态内容,如上所述很容易,但在这里我看不到,有什么值得详细学习的。

因为起初我有一点 Python 经验,所以我将搜索范围缩小到这种语言。

  • 我发现为此目的制作的唯一工具是我尝试过的 vpython。然而,与我过去使用tikz.

  • 然后我发现了一些不错的绘图工具,例如mathplotlib, mayavi, bokeh, chaco, nodebox, pyqtgraph, vispy,它们可能可以用来制作动画protovisvisvis但我不确定这是否是一个好方法,因为它们似乎更适合静态绘图

  • 我发现的下一个类别是游戏引擎,例如pygameor pyletpanda3dor python-ogre我不确定将这样的完整游戏环境用于物理动画是否是个好主意。

  • 另一种可能性是直接使用 Python 的 OpenGl 绑定:pyopengl

  • 然后有blender

  • 最后似乎有很多专门的工具,比如pymbs,pyblocksimpyOpTools

然而,我可以在网上找到的大多数物理动画或模拟都是 java 小程序。它们中的大多数都是封闭源代码,所以我没有发现它们使用了哪些 java 库。唯一的一个是ejs具有图形用户界面,但看起来有点过时。

最后我考虑使用html5这个。

3个回答

对于我的工作,我倾向于让程序输出一系列静止图像,然后在后期处理步骤中将它们转换为动画格式。为了制作视频,我使用 ffmpeg ( http://www.ffmpeg.org/ );为了制作 .gif,我使用 imagemagick ( http://www.imagemagick.org/ )。这两个工具都很容易从命令行编写脚本。有许多可用的教程演示了每个程序的此过程。

我认为这个问题背后的基本思想非常有价值(不过,这个问题应该更精确一些),很高兴看到以社区 wiki 样式格式的答案,其中包含软件列表和每个项目的简短说明。然而,下面是我的胡言乱语和个人经历。

2D 动画

正如您已经知道的那样,特别是带有 TikZ/PGF 的 LaTeX 可以产生非常高质量的绘图。我通常使用 PGFPlots 来绘制学术论文等的最终数字,无论如何,除了静态图形之外的任何东西都是不可能的。但是请注意,您实际上可以在 LaTeX (PGFPlots) 中制作动画,正如 TeX.SE 中的许多问题所证明的那样(是的,它很容易出错)。您还可以在 PGFPlots 中绘制简单的 3D 图像。可以使用 Asymptote 生成稍微更具交互性和 3D 的图形,Asymptote 是一种与 LaTeX 很好交互的语言。有一个缺点:据我所知,唯一可以显示这些及其所有属性的阅读器是 Adob​​e Acrobat。

然后是不同的编程语言及其不同的绘图后端:Python、Julia、R 和 Octave,仅举几例科学家通常用于其图形功能的语言。其中许多可能如果不是默认的,至少可以使用 gnuplot 并且应该能够以 3D 绘图。大多数明确支持动画,而那些不支持的,则支持打印出静态图像,然后您可以将其 ffmpeg/avconv/mencoder 放入视频中(无论如何,这是为动画提供前端的库通常在幕后执行的操作)。

现在LaTeX的输出质量这么高的原因之一是它的默认输出格式是PDF,可以存储矢量图形。需要注意的是,大多数其他用于绘图的程序也可以输出矢量图形,但 png 和其他无损光栅图形通常是默认设置。但是,使用最常见文件格式的动画,.gif、.avi 等,您将失去生成矢量图形的能力。好吧,不完全是,我已经提到 PDF 确实支持一些简单的动画。

更好的是,最常见的矢量图形格式 SVG 可以创造奇迹:您甚至可以仅使用 SVG 的特性来编写整个游戏,因此动画很容易。实际上,在准备演示幻灯片时,我在很大程度上从 Beamer 切换到了 HTML5(在某种程度上,SVG 是 HTML5 的一部分),主要是因为它支持动画(两者都是由文档本身交互生成的,但也因为使用 HTML5,嵌入.avis 轻松无忧)。我发现特别有用的是 D3.js,一个用于显示数据(在 SVG 中)的 JavaScript 库。它可以做的不仅仅是简单的绘图,所以它的使用有时会变得有点笨拙。也就是说,图书馆的文档非常完善,并且已经有关于它的书籍。C3.js 是用于绘制图表的 D3.js 的更简单接口,

3D动画

如果您真的想要像 JJ Abrams 那样带有镜头光晕的高质量图形,并且这也适用于 2D,矢量图形不会削减它:您很可能想要使用一些图像过滤器,而矢量图像中可用的过滤器很少格式。现在在 2D 中,这通常不是问题(除非您想包含照片),但对于 3D 透视图,这样的过滤器有很大帮助。有几种方法可以生成看起来像 3D 的矢量图形;例如 LaTeX 的 Sketch 或 MolScript 的 PostScript 输出,仅举几例,但这些通常是特定于应用程序的,甚至无法模拟不同种类的材料等。那么,您真正想要的是呈现任何 3D您想要看起来艺术或逼真的数据而不仅仅是草图,是光线追踪。

我喜欢 POVRay,它是开源的、有据可查且易于使用的。我说易于使用,但可能需要弄清楚如何将它与科学数据一起使用,因为它不是为那些受众而构建的,但它可以做到。分子动力学 (MD) 模拟中流行的一种是 Tachyon,因为它就是为此特定目的而构建的。它带有 VMD,这是最受欢迎的 MD 数据查看器之一。

模拟

我上面写的实际上只是关于静态动画:您制作但后来无法影响的动画,例如 .avi 文件(不过,关于 SVG/D3.js 的部分以交互方式工作)。为什么?因为模拟细节取决于平台:你想要一个网站还是一些物理现象的可下载演示?或者您是否有一个模拟 API 并希望将您自己的交互式图形接口连接到它,以便您可以影响模拟并查看正在发生的事情?

如果您想在线部署,是的,现在您可能想要使用 HTML5(在 JavaScript 中构建模拟并将其与一些基于 SVG 或画布的解决方案连接,例如通过 D3.js)。对于 3D,您可能会使用 WebGL 库。如果您对离线感到满意,那么那里有成千上万的库,其中许多是基于 OpenGL 构建的。

我已经使用过很多 matplotlib,但不是用于动画。但是,我认为matplotlib 动画模块允许您将任何以编程方式创建的图像序列转换为动画。

作为一个例子,请看这个粒子从势垒(和部分调谐)反弹的波函数动画。它的创建者还写了一个简短的教程