✍️ 朱邓达  •  📅 2025-06-18

movie

官方文档:

movie

简介:

制作动画

语法

gmt movie mainscript -Ccanvassize[+c|i] -Nprefix -Tnframes|min/max/inc[+n]|timefile[+pwidth][+sfirst][+w[str]|W] [ -Aaudiofile[+e] ] [ -Ddisplayrate ] [ -Etitlepage[+d[duration[s]]][+f[i|o][fade[s]]][+gfill] ] [ -Fgif|mp4|webm|png[+ioptions][+l[n]][+ooptions][+sstride][+t][+v] ] [ -G[fill][+ppen] ] [ -Hscale] [ -Iincludefile ] [ -K[+f[i|o][fade[s]]][+gfill][+p[i|o]] ] [ -Llabelinfo ] [ -M[frame],[format][+rdpu][+v] ] [ -Pprogress ] [ -Q[s] ] [ -Sbbackground ] [ -Sfforeground ] [ -V[level] ] [ -W[dir] ] [ -Z[s] ] [ -fflags ] [ -x[[-]n] ] [ --PAR=value ]

描述

movie 模块能够使用单个绘图脚本生成 GMT 动画,该脚本会重复应用于所有帧, 同时通过特定帧变量进行一些变化。该模块简化(并隐藏)了通常设置完整动画任务所需的大部分步骤。 相反,用户可以专注于构建主帧绘图,而让帧的并行执行以及图片到动画的组合在后台进行。 单个帧会从 PostScript 绘图转换为无损、不透明的 PNG 图片, 并可选择组合成动画(这最后一步需要外部工具,这些工具必须存在于用户的路径中; 请参阅下面的 技术细节 )。用户可以根据需要添加片头、淡入淡出效果、标签和进度指示器。

必选选项

mainscript

一个独立的 GMT 现代模式主脚本,用于生成帧。 该脚本可以访问帧变量,例如帧号等,并且可以使用 Bourne shell(.sh)、Bourne again shell(.bash)、 csh(.csh)或 DOS 批处理语言(.bat)编写。 脚本语言根据文件扩展名推断,然后 GMT 使用相同脚本语言构建隐藏的 movie 脚本。 可访问的参数将在下文讨论。 注: 如果最终的 gmt end 语句以 show 结尾,则会展示动画主帧(仅当使用了 -M 时)。

-Ccanvassize[+c|i]

指定组合帧时的画布大小。支持两种指定方式:

  • 使用专有名称指定预设格式(见下方表格 Presets 第一列的名称)。

  • 用户可指定自定义布局 widthxheightxdpu , 其中像素密度 dpu (dots-per-unit)为每单位大小内的像素点数 (在预设格式中像素密度会自动计算)。也可以在后面加上 +c+i 指定 dpu 的单位大小为每厘米 (cm) 或每英寸 (inches) 。

注: 用户设定的 PROJ_LENGTH_UNIT 将决定 movie 模块使用 SI 或 US 单位。

16:9 (24x13.5 cm or 9.6x5.4 inch)

Preset format (alias)

Pixel dimensions

DPC

DPI

4320p (8k and uhd-2)

7680 x 4320

320

800

2160p (4k and uhd)

3840 x 2160

160

400

1080p (fhd and hd)

1920 x 1080

80

200

720p

1280 x 720

53.3333

133.3333

540p

960 x 540

40

100

480p

854 x 480

35.5833

88.9583

360p

640 x 360

26.6667

66.6667

240p

426 x 240

17.75

44.375

4:3 (24x18 cm or 9.6x7.2 inch)

Preset format (alias)

Pixel dimensions

DPC

DPI

uxga

1600 x 1200

66.6667

166.6667

sxga+

1400 x 1050

58.3333

145.8333

xga

1024 x 768

42.6667

106.6667

svga

800 x 600

33.3333

83.3333

dvd

640 x 480

26.6667

66.6667

-Nprefix

指定最终动画文件的名称以及包含帧图片的子目录(例外情况见 -W )。 注: 如果该子目录已存在,则 GMT 将立即退出。 因此,用户需要先删除以该名称命名的任何旧目录。这样做是为了防止意外丢失重要数据。 用户可以通过使用 -Z 在成功运行后删除该目录来避免此问题。

-Tnframes|min/max/inc[+n]|timefile[+pwidth][+sfirst][+w[str]|W]

创建一个包含从 minmax 每隔 inc 变化的一列数据集以指定要生成多少帧, 或提供一个数据集文件 timefile ,一个记录(即一行)对应一帧。 列中的值将作为命名变量 MOVIE_COL0MOVIE_COL1 等的形式提供给主脚本 mainscript ,而每行任何尾部文本都可以通过变量 MOVIE_TEXT 进行访问。 文件行数即为帧数。注意 timefile 文件可以在 background 脚本中创建(见 -Sb ), 因此在 background 脚本执行前后 GMT 都会查找 timefile 是否存在。 如果仅指定帧数 nframes ,则只有变量 MOVIE_FRAME 可用,因为没有数据文件。 对于数组生成的一些细节参数,详见 生成一维数组 。还支持以下子选项:

  • +n - inc 变为 minmax 之间的帧数。

  • +p - 设置每帧图片命名的帧号格式的标签宽度 width , 例如 name_000010.png 的帧号标签宽度为 6 。默认自动设置 width , 但如果用户将大型任务分布在多台计算机上的话(通过 +s ), 用户必须确保所有帧名称的标签宽度一致。

  • +s - 输出帧起始编号从 0 改为 first 。 注意这仍然包括所有帧,该子选项仅影响输出编号。

  • +w - 将尾部的文本字符串拆分成单个单词,可通过变量 MOVIE_WORD0, MOVIE_WORD1 访问。默认将空格符 (spaces) 或制表符 (tabs) 作为分隔符,可自定义 str 作为有效分隔符。 使用 +W 则将 TAB 作为唯一分隔符。

可选选项

-Aaudiofile[+e]

添加音轨(例如旁白解说),大概与动画长度相同,但可以更短或更长。 GMT 将音轨与第一帧对齐。使用 +e 可将拉伸音轨以精确适配动画长度 (前提是缩放比例不小于0.5或大于2.0)。

-Ddisplayrate

设置最终动画帧率(每秒) [默认 24]。

-Etitlepage[+d[duration[s]]][+f[i|o][fade[s]]][+gfill]

指定脚本 titlepage 以创建静态页面作为动画片头 [默认无片头]。 或者,titlepage 可以是尺寸与 -C 中设置的画布大小完全匹配的 PostScriptEPS 图(文件扩展名为.ps)。支持以下子选项控制片头:

  • +d - 设置片头持续长度,后跟 duration 表示持续帧数,有单位 s 表示持续秒数 [默认 4 秒]。

  • +f - 为片头添加以帧号或秒数(带单位 s )为单位的淡入淡出长度 fade [默认 1s] 。 使用 +fifo 可分别指定单边的淡入或淡出长度, 或者都使用以指定长度不等的淡入淡出 [默认淡入淡出长度一致]。 淡入淡出效果会影响片头持续时间 duration

  • +gfill - 设置淡入前和淡出后的颜色 [默认 black]。

关于淡入淡出效果,详见 片头和淡入淡出-K 也有相关用法。

-Fgif|mp4|webm|png[+ioptions][+l[n]][+ooptions][+sstride][+t][+v]

选择动画输出类型,可多次使用 -F 以生成多种类型。可选类型包括 gif , mp4 , webm , 或只是 png 图片。其中 mp4webm 为电影格式,需使用 FFmpeg 工具将多个图片组合成电影。如果只选择 png 则不会组合。 不使用 -F 则不会输出任何与动画相关的文件(但要求使用 -M )。支持以下子选项:

  • +i - 为输入文件添加额外的 FFmpeg 编码设置(多个词用引号括住)。

  • +l - 循环播放 gif 动画,或者可指定循环次数 n [默认一直循环] 。

  • +o - 为输出文件添加额外的 FFmpeg 编码设置( mp4webm ,多个词用引号括住)。

  • +s - 当输出类型为 mp4webm 时,指定步长 stride 可创建帧率低的 gif 图, 其中 stride 可取 2, 5, 10, 20, 50, 100, 200, 和 500 。

  • +t - 选择生成透明的 PNG 图片 [默认不透明]。 详见 透明图片

  • +v - 使用默认预览工具打开 mp4webm

-G[fill][+ppen]

在绘制开始前,设置画布填充色 [默认无填充],使用 +p 指定画布轮廓画笔属性 [默认无轮廓]。

-Hscale

由于在将 PostScript 图形栅格化为 PNG 图像时所使用的每单位像素点是有限的, 因此将特征量化为离散像素会导致舍入误差。 部分这种误差可以通过抗锯齿设置来减轻。然而,不同帧之间的变化不受单个帧的栅格化操作控制, 特别是移动的文本在最终动画中可能会显得抖动。 用户可以通过选择一个整数缩放比例 scale 来减轻这种影响, 该比例实际上会暂时将每单位有效点数增大 scale 倍,然后对帧进行栅格化处理, 最后以相同的比例对图像进行降采样。 scale 越大,过渡就越平滑。 由于处理时间会随着缩放比例的增加而增加,GMT 建议用户尝试 2 到 5 之间的值。 请注意,当原始数据的分辨率远高于最终帧的像素尺寸时,图片也可能因量化而受到影响。 此时也可以使用 -H 选项来平滑结果以避免锯齿现象 [默认不进行降采样]。 这种影响被称为亚像素渲染 (subpixel rendering)。

-Iincludefile

includefile 的内容插入所有 movie 脚本都会访问的 movie_init.sh 脚本中。 这种机制用于添加信息(通常是常量赋值),这些信息是主脚本 mainscript-S 指定的脚本所依赖的。

-K[+f[i|o]fade[s]][+gfill][+p[i|o]]

为动画添加淡入淡出效果 [默认不添加]。支持以下子选项:

  • +f - 设置淡入淡出长度 fade [默认 1s] 。 使用 +fifo 可分别指定单边的淡入或淡出长度, 或者都使用以指定长度不等的淡入淡出 [默认淡入淡出长度一致]。

  • +gfill - 设置淡入前和淡出后的颜色 [默认 black]。

  • +p - 保留所有帧。通常情况下,淡入淡出将被覆盖在动画的前几帧和后几帧上。 使用 +p 进行复制来保留这些帧。添加 io 分别只保留淡入或淡出的帧。

关于淡入淡出效果,详见 片头和淡入淡出-E 也有相关用法。

-Llabelinfo[modifiers]

为每帧自动添加标签。最多可重复添加 32 个标签。将选定的标签放置在帧边缘,支持以下几种标签类型:

  • e - 持续时间(秒),可加上 +sscale 指定每帧对应时长(秒)[默认为帧率倒数]。

  • sstring - 固定字符串 string

  • f - 当前帧号 [默认标签]。

  • p - 当前进度百分比。

  • ccol - 使用 timefile 文件中列索引为 col 的值(首列索引为 0 )。

  • tcol - 使用 timefile 文件中尾部文本列的列索引为 col 的单词(第一个单词索引为 0 )。

注: 如果用户使用 -Lc 指定的列元素为绝对时间,则时间戳的格式依赖 FORMAT_DATE_MAPFORMAT_CLOCK_MAP 这两个参数。默认情况下, 日期 date 和时间 time 都会显示(中间空格隔开),将其中一个参数设置为 “-” 即可跳过该项。标签的外观属性可用以下子选项控制:

  • +cdx[/dy] - 设置标签和其边界框的间距,仅在设置了 +g+p 时使用。 附加单位 c|i|p 或字体大小的百分比 [15%]。

  • +f - 设置字体属性 [FONT_TAG] 。

  • +gfill - 设置标签边界框的填充色 [默认不填充] 。

  • +h[dx/dy/][shade] - 在标签边界框后添加下拉式阴影。用户可指定偏移量 dx/dy [4p/-4p] 和阴影颜色 [gray50],要求使用 +g [默认无阴影] 。

  • +jrefpoint - 设置标签位置 [TL] 。

  • +odx[/dy] - 根据 +j 指定的位置做偏移。 附加单位 c|i|p 或字体大小的百分比 [20%]。

  • +ppen - 指定标签边界框的画笔属性 [默认不绘制] 。

  • +r - 与 +g+p 一起使用,设置圆角矩形标签边界框 [默认直角]。

  • +tformat - 设置标签显示格式 [默认无特殊格式] 。

注: 如果使用了 -Lt ,则标签显示格式必须包含类似 %s 的格式。 其它标签类型则可能包含整数 (%d) 或浮点数 (%e, %f, %g) 。格式详见 C 语言的 printf 函数。

-M[frame|f|m|l],[format][+rdpu][+v]

除了制作动画序列,还可以单独绘制自定义主帧 frame [默认第 0 帧]。 该帧将被保存到当前目录中, 文件名命名为 prefix.format ,其中 format 为 GMT 允许的图形格式 [pdf]。 除了指定主帧 frame ,还会使用 first, middle, 和 last 代表对应帧。 注: 对于栅格帧格式,用户还可以通过 +r 指定该帧新的 dpu [默认与动画帧的 dpu 相同]。最后,添加 +v 可以默认查看器打开主帧。

-Pprogress[modifiers]

自动添加进度指示器。最多可重复添加 32 个指示器。 根据选定的对齐方式将选定的指示器放置在帧边缘。指示器可从 a-f 中选择 [a] 。 a-c 是不同类型的圆形指示器,而 d-f 是线性(轴状)指示器。 详见 进度指示器 。支持以下子选项控制外观:

  • +a - 对进度指示器 b-f 进行标注, 后加 e|f|p|s|ccol|tcol 之一,以指示应该标注的内容(对应含义详见 -L )。

  • +f - 指定字体 [FONT_ANNOT_SECONDARY] 。

  • +gfill - 设置活动项的填充色。

  • +Gfill - 设置静止项的填充色。

  • +jrefpoint - 设置指示器位置 [默认圆形指示器在 TR ,轴状指示器在 BC] 。

  • +odx[/dy] - 根据 +j 指定的位置做偏移。

  • +ppen - 设置活动项的画笔属性。

  • +Ppen - 设置静止项的画笔属性。

  • +sscale - 用帧号乘以比例 scale 来计算经过的时间。

  • +tformat - 设置标注显示格式 [默认无特殊格式] 。

  • +wwidth - 设置指示器大小 [对于圆形指示器,默认大小为画布最大边长的 5% ; 对于轴状指示器,默认长度为 +j 指定画布边的边长的 60%%]。

-Q[s]

用于调试:保留 GMT 创建的所有文件和目录以供检查。 或者,添加 s 只构建 movie 脚本,但不做任何运行。 一个例外是从 -Sb 指定后台脚本总是被执行,因为它可能在构建 movie 脚本时产生所需的数据。

-Sbbackground

指定一个 GMT 现代模式脚本 background (使用与 mainscript 相同的脚本语言编写), 其可用于以下两个目的:

  1. 它可以生成一些文件(例如 timefile ),这些文件是 mainscript 制作动画时所需的;

  2. 它可以生成一个静态背景图,该图应作为所有帧的背景。 此时脚本必须确保其使用与 mainscript 相同的绘图原点(即 -X-Y), 以便图层能够正确堆叠(除非用户确实希望有不同的偏移量)。

另外,background 可以是与画布尺寸完全匹配的 PostScriptEPS 图。

-Sfforeground

指定一个 GMT 现代模式脚本 foreground (使用与 mainscript 相同的脚本语言编写), 用来制作静态前景图,该前景图会覆盖在所有帧上。 确保其使用与 mainscript 相同的绘图原点(即 -X-Y),以便图层能够正确堆叠。 另外,foreground 可以是与画布尺寸完全匹配的 PostScriptEPS 图。

-V[level] (more …)

设置 verbose 等级 [w]

-W[dir]

默认情况下,所有临时文件和帧的 PNG 文件都会在通过参数 -N 设置的子目录 prefix 中创建。 用户可以通过提供另一个目录 dir (相对路径或完整路径)来覆盖此选择。 如果未给出 dir ,则会在系统临时文件夹中创建一个名为 prefix 的工作目录。 工作目录的主要优点是避免像 Dropbox 或 TimeMachine 这样的代理程序产生的无休止的同步问题, 或者避免由于主目录空间不足而产生的相关问题。

-Z[s]

在合成动画后,将整个 prefix 目录删除 [默认情况下会保留包含所有图片的目录、 临时脚本文件、参数文件和图层 PostScript 文件都会被删除(例外情况见 -Q )] 。 如果用户希望同时删除 mainscript 以及通过 -E-I-S 选项 传入的所有输入脚本,则添加 s

-f[i|o]colinfo (more …)

指定输入或输出列的数据类型

-x[[-]n] (more …)

限制多核算法中能使用的核数(需要GMT开启OpenMP支持)

movie 模块是例外,其并行不需要 OpenMP。 注: 一个核被 movie 使用,所以实际上 n-1 个核被用于帧生成。

-^-

显示简短的帮助信息,包括模块简介和基本语法信息(Windows下只能使用 -

-++

显示帮助信息,包括模块简介、基本语法以及模块特有选项的说明

-? 或无参数

显示完整的帮助信息,包括模块简介、基本语法以及所有选项的说明

--PAR=value

临时修改GMT参数的值,可重复多次使用。参数列表见 配置参数

生成一维数组

下面将展示如何使用 gmtmath 生成一维数组(其中大部分操作也可通过 linux 中的 seq 命令方便地实现)

不使用任何子选项

以 0.1 为步长,生成 3.1 到 4.2 等等间隔序列

gmt math -o0 -T3.1/4.2/0.1 T =
3.1
3.2
...
4.2

+a 选项

该选项不对生成的数列进行运算操作,而是将该数列以列的形式追加到输出表数据,类似 linux 中的 paste 命令。

+b 选项

以 3 和 20 分别为起点和终点,创建一个 2 的整数幂的列表,将生成 的整数幂以 1 为步长取值 -T3/20/1+b

gmt math -o0 -T3/20/1+b T =
4
8
16

+l 选项

以 7 和 135 分别为起点和终点,先创建一个 10 的整数幂的列表,当 inc 为 1 时,输出该列表;当 inc 为 2 时,同时输出该列表中每个元素的 1,2,5 倍值(不包括超出原始数据范围的部分); 当 inc 为 3 时,同时输出 该列表中每个元素的 1,2,…,9 倍值(同样不包括超出原始数据范围的部分)。 -T7/135/2+l 将会生成如下数列

gmt math -o0 -T7/135/2+l T =
10
20
50
100

inc 为负整数时,将实现如下效果

gmt math -o0 -T1e-4/1e4/-2+l T =
0.0001
0.01
1
100
10000

+i 选项

该选项将以 1 作为默认步长,第三个数字做为每步长中的数字个数 length。假设需要在 1 分钟内每 24 秒生成一帧

gmt math -o0 -T0/60/24+i T =
0
0.0416666666667
0.0833333333333
0.125
0.166666666667
...
60

+n 选项

生成固定长度的数列。以 3.44 和 7.82 为 起点和终点,生成长度为 5 的等间隔序列

gmt math -o0 -T3.44/7.82/5+n T =
3.44
4.535
5.63
6.725
7.82

-T 后直接加文件或逗号分隔的数列

-T 后可以直接加文件,文件中即为要生成的列表;另外,可以直接使用逗号分隔, 将列表附加到 -T 选项后,如下为 Fibonacci 数列前 6 项

gmt math -o0 -T0,1,1,2,3,5 T =
0
1
1
2
3
5

: 如果数列只包含一个值,必须在其后加逗号以表明仍是一个数列

+u 选项

如果文件或者逗号分隔的数列中有重复数字或未排序,可以使用 +u 选项去重并排序。

+t 选项

生成绝对时间序列。在 inc 后分别添加 yodhms 表示时间步长的单位为年,月,日,时,分,秒。在其后附加 +t 选项, 可以进一步强调生成时间序列,也可以不加

gmt math -o0 -T2020-03-01T/2020-03-07T/1d T =
2020-03-01T00:00:00
2020-03-02T00:00:00
2020-03-03T00:00:00
2020-03-04T00:00:00
2020-03-05T00:00:00
2020-03-06T00:00:00
2020-03-07T00:00:00

生成距离序列

如果输入文件中包含两列以上的数据,可以使用前两列计算距离,并生成等距序列。 在 inc 后分别添加 dmsefMnu 表示距离步长的单位为度,分,秒,米,英尺,公里,英里,海里,英尺。如果 为笛卡尔坐标,使用 c 作为距离步长单位。

+e 选项

如果只给定 inc 而从数据中获取最大值和最小值,则 (max - min)/inc 可能 不是整数,GMT 讲会自动对 inc 进行一定的调整。如果不想调整 inc ,则可以 使用 +e 选项,GMT 会固定最小值,适当调整最大值。

参数

以下参数是自动分配的,可以在编写 mainscript 和可选的 backgroundforeground 脚本时使用。有两组参数:一组是常量,另一组随帧号变化。

所有脚本都可以访问这些常量:

  • MOVIE_WIDTH - 画布宽度

  • MOVIE_HEIGHT - 画布高度

  • MOVIE_DPU - 当前 dpu (每单位大小内的像素点数)

  • MOVIE_RATE - 当前帧率(每秒展示多少帧)

  • MOVIE_NFRAMES - 总帧数

此外,如果使用了 -I ,那么其内列出的任何静态参数也将对所有脚本可用。

mainscript 还可访问随帧号变化的参数:

  • MOVIE_FRAME - 当前帧号(整数, e.g., 136)

  • MOVIE_ITEM - 格式化的帧号 (字符串, e.g., 000136)

  • MOVIE_NAME - 当前帧的名称 (即 prefix_MOVIE_ITEM

  • 此外,如果提供了 timefile 文件,还可访问:

    • MOVIE_COL0 , MOVIE_COL1 , … - timefile 文件中每行的各列值

    • MOVIE_TEXT - timefile 文件中每行的尾部文本

    • MOVIE_WORD0 , MOVIE_WORD1 , … - 当使用 -T+w 对尾部文本进行分割或在 -L-P 中隐式地做了分割后, 可使用该参数访问每个词。

数据文件

在执行 movie 时,movie 脚本能够找到起始目录中现有的任何文件, 以及由 mainscript 生成的任何新文件,或者通过 -S 参数设置的任何附加脚本所生成的文件。 无需指定路径即可访问这些文件。 其他文件可能需要完整的路径,除非其所在的目录已在 DIR_DATA` 设置中包含。

自定义 gmt.conf 文件

在执行 movie 前,如果在主脚本 mainscript 所在目录下有 gmt.conf 文件, 那么它将在所有创建和执行的脚本中被共享使用,除非用户的脚本在启动新的现代模式会话时使用了 -C 选项。更改 GMT 默认设置的首选方式是在输入脚本中使用 gmtset 命令。 注: 每个脚本都是在独立的现代模式下运行的, 因此试图通过在运行时创建一个 gmt.conf 文件以供其他脚本使用是徒劳的。

绘制时间变化

如果动画没有任何变化,那就没意思了。要让动画动起来,用户需要确保主脚本 mainscript 能够随着帧号变化而访问不同的数据集,或者只需绘制数据集中的一个变化的子集, 从而只在每一帧中显示应该显示的部分。用户可以采用多种策略来实现这些效果:

  1. 用户传递给 -Ttimefile 可能包含特定数据文件的名称, 用户只需在主脚本中使用相应的 MOVIE_TEXTMOVIE_WORD 来访问特定帧的文件名即可。

  2. 用户有一个数据表格 timefile ,其中包含了每条记录的绝对时间。 用户希望随着时间的推移来展示这些记录,但不显示未来发生的记录。 此效果可通过设置 -q 选项 来选择输入行, 或使用 events 模块来实现。

  3. 用户有一个三维网格(或者是一系列二维网格的堆叠)并且想要沿着垂直轴进行插值 (例如深度轴)。在这种情况下,用户将使用 grdinterpolate 模块, 让主脚本获取对应于正确动画时刻的切片(这可能是两个不同深度之间的插值), 并使用这个临时网格文件来制作帧图。

  4. 用户可能正在使用 gmtmathgrdmath 动态地创建数据,并显示这些数据; 或者可能每帧稍微不同地处理数据(使用 timefile 中的参数),并展示不同处理的帧之间的变化。

画布

Source Code

../../_images/00baa5d8320cc8bfc9f1481c93d573b6.png

MOVIE_WIDTHMOVIE_HEIGHT 代表了画布尺寸,用户可使用 -X-Y 来设置绘图原点 [72p, 72p] 并使用投影参数 -J 来指示选择用于绘图的区域(图中绿色区域)。

-C 所述,除非用户指定了自定义布局,否则用户获得的画布尺寸要么是 24 x 13.5 厘米 (16:9),要么是 24 x 18 厘米(4:3)。如果用户的 PROJ_LENGTH_UNIT 设置为英寸, 那么画布尺寸(9.6 x 5.4 英寸或 9.6 x 7.2 英寸)仅比相应的国际单位制尺寸略大(1.6%); 这不会对动画尺寸产生影响,但允许用户使用与所选 dpu 相配合的合适尺寸。 用户应使用给定的画布尺寸来绘制图层,而 movie 会做适当转换将画布转换为图像像素尺寸。 用户有责任使用 -X-Y 来留出合适的边距以及在画布上对各绘图元素进行任何定位。 为了减少处理时间,建议将动画的任何静态部分视为静态背景 (由 background 脚本一次性生成;见 -Sb)和/或静态前景(由 foreground 一次性生成;见 -Sf);然后 movie 会按帧组装这些层。 此外,任何在帧循环中使用的静态数据文件的计算都可以由 background 脚本完成。 任何依赖帧号的数据或变量都必须通过主脚本计算或设置,或者按照上述方式通过参数提供。 注: 使用变量 MOVIE_WIDTHMOVIE_HEIGHT 来设定绘图尺寸可能会导致图形被裁剪到画布之外,因为这些值正是画布的实际尺寸。

外部 PostScript 图层

除了将 GMT 现代脚本传递给 -S 外,用户还可以提供 PostScript 图层文件的名称。 注意,这些图层必须与画布尺寸完全匹配。举个简单的例子, 如果用户正在制作一个使用 US 单位尺寸的 HD 电影,那么一个背景粉色图层将由以下方式创建:

gmt basemap -R0/9.6/0/5.4 -Jx1i -B+gpink -X0 -Y0 --PS_MEDIA=9.6ix5.4i -ps background

其中注意通过 PS_MEDIA 进行的画布选择、匹配的区域和投影以及绘图原点在 (0,0)。

底图边框

某些地图投影默认会绘制出一个 fancy 地图边框;此功能受 MAP_FRAME_TYPE 控制。 然而,实际绘制的是 fancy 边框还是 plain 框架还取决于投影中心纬度。 因此,如果用户的影片通过改变视角来改变投影中心纬度,那么用户在设置时应将边框类型设为 plain

透明图片

默认情况下, movie 会生成不透明的 PNG 图片,这些图片随后可以组合成动画。 大多数动画很可能会以这种方式制作。 使用 -F 选项的实验性选项 +t 可以生成透明的 PNG 图像。 目前,很少有视频编解码器支持透明度。据称 H.265(HECV)和 VP9(Webm)都具备这一功能; GMT 团队只能通过在 Chrome 中观看透明的 Webm 文件来验证后者。 GIF 也可以由透明的 PNG 图像构建而成,这里每个额外的帧都会累积到最终的动画中。 专家可能会创建透明的 PNG 图像,并使用支持透明通道的专业工具来制作动画。

添加音轨

使用 -A[+e] 选项,用户可以添加音频轨道,比如为动画配音、添加音乐,或者添加任何内容。 最终的动画长度将与音频或动画中最长的部分长度相匹配, 所以用户可能需要对音频文件进行处理以适应动画。 由于动画的长度已知为 帧数/帧率,因此用户可以对音频轨道进行预处理以使其具有匹配的长度。 或者,如果音频轨道的长度与动画长度大致相同(动画长度的 ±50% 范围内), 则可以添加 +e 选项将音频轨道缩放至与动画完全相同的长度。

技术细节

movie 模块会创建若干隐藏的脚本文件,这些文件用于图像的生成 (由于文件扩展名取决于所使用的脚本语言,此处未列出扩展名):

  • movie_init (初始化与画布大小和每单位点数相关的变量,并包含可选 includefile 的内容)

  • movie_preflight (可选,因为它源自 -Sb 并计算所需的数据文件以及可能的背景层)

  • movie_postflight (可选,因为它源自 -Sf 并构建前景层)

  • movie_frame (接受帧计数参数并构建帧图像)

  • movie_cleanup (在运行结束时删除临时文件)

对于每个帧,都有一个单独的名为 movie_params_###### 脚本提供了特定帧的变量(例如,帧号以及通过 -T 给出的任何内容)。 preflightpostflight 脚本可以访问 movie_init 中的信息, 而 frame 脚本在此基础上还能访问这个帧参数文件。 使用 -Q 选项会生成这些脚本,然后用户可以对其进行查看。 注: 主脚本会按帧复制,并且每个副本都会同时在所有可用内核上运行。 因此,多线程的 GMT 模块也将只能使用单个核心。

将 PNG 图帧转换为动画 GIF(使用选项 -Fgif )需要使用 GraphicsMagick 工具。 因此,gm 必须能通过标准搜索路径访问到。 同样,将 PNG 图帧转换为 MP4(使用选项 -Fmp4 )或 WebM(使用选项 -Fwebm ) 的视频文件也依赖于 FFmpeg

Shell 局限性

由于无法控制 shell(例如 bash 或 csh)在两个进程之间实现管道操作的方式(这通常涉及 sub-shell), 因此 GMT 建议不要在主脚本中使用涉及将一个 GMT 模块的结果传递到另一个模块的命令 (例如,gmt blockmean ….. | gmt surface …)。 因为 movie 会同时运行主脚本的多个副本,当涉及 sub-shell 时可能会出现奇怪的情况。 根据经验,在 movie 脚本中使用管道可能会损坏 GMT 历史文件, 导致某些帧出现诸如区域未设置之类的错误消息。 在编写 movie 主脚本时,可以使用临时文件将这样的管道结构拆分为两个部分。 注: 从非 GMT 模块到 GMT 模块或与之相反的管道操作是没问题的 (例如,echo ….. | gmt plot …)。

制作动画的提示

制作动画相对简单,但用户需要从变量的角度去思考问题。 仔细研究以下所描述的示例。然后,先制作一个单一的绘图脚本(即主脚本), 并确定哪些内容会随时间变化(即随着帧号的变化)。为这些值创建变量。 如果它们属于 movie 创建的参数,则使用这些名称。 除非只需要帧号,否则用户还需要创建一个可以传递给 -T 的文件。 这个文件应包含用户所需的所有数值,这些数值会按帧(即行)排列, 且涵盖了用户所需的所有列中的数值。 如果用户需要分配一些不随时间变化的固定变量,则将这些赋值任务转移到单独的 includefile-I)文件中会使得主脚本看起来更简洁、更清晰。 要测试输出动画,可首先使用选项 -Q-M 以确保主帧页面看起来正确。 这个页面会显示动图的一个帧(可以通过 -M 参数选择要显示的帧)。 修复在使用变量和选项时出现的任何问题,直到一切正常为止。然后用户可以尝试删除 -Q。 GMT 建议用户制作一个非常简短(-T)且尺寸较小(-C)的影片,这样就能很快看到结果。 一旦一切正常运行,用户就可以增加帧数和提高影片质量了。

颜色表的使用

因为 movie 将不同帧的绘制作为单独的会话并行运行,所以用户无法使用当前的 CPT (即由 makecptgrd2cpt 直接创建的最后一个 CPT, 或者通过 grdimagegrdview 间接创建的)。 因此,用户必须使用明确的文件来创建 CPT,并将这些文件名传递给需要 CPT 信息的模块。 在现代模式下,这意味着用户需要在 makecptgrd2cpt 中使用 -H 选项, 以便将它们的输出重定向到指定的文件中。

进度指示器

https://docs.generic-mapping-tools.org/latest/_images/GMT_movie_progress.png

六种进度指示器。它们都有默认的大小、位置、颜色和笔(如图所示),但这些都可以被相应的子选项覆盖(见下文)。

使用字母 a-f 选择上述六个进度指示器中的一个;每个都有默认的属性,可以通过子选项来改变:

  • a - 需要指定静止项填充色 (+G) [lightgreen] 和活动项填充色 (+g) [lightred] , 没有标注选项。

  • b - 可指定静止项画笔 (+P) [lightblue] 和活动项画笔 (+p) [blue] , 如果使用了 +a ,则在中心添加一个标注,大小为指示器大小的 30% (除非使用了 +f 自定义字体大小)。

  • c - 可指定静止项画笔 (+P) [dashed darkred,宽度为指示器大小的 1%] 和弧形矢量的活动项画笔 (+p) [red,宽度为指示器大小的 5%] , 其箭头大小为指示器大小的 20% 。如果使用了 +a ,则在中心添加一个标注, 大小为指示器大小的 30% (除非使用了 +f 自定义字体大小)。

  • d - 可指定静止项画笔 (+P) [black] 和活动项画笔 (+p) [yellow,宽度为指示器大小的 0.5%] ,如果使用了 +a ,则标注字体大小为静态画笔宽度的两倍 (除非使用了 +f 自定义字体大小)。

  • e - 可指定静止项画笔 (+P) [red] 和活动项画笔 (+p) [lightgreen] , 如果使用了 +a ,则标注字体大小为静止画笔宽度的两倍(除非使用了 +f 自定义字体大小)。

  • f - 可指定静止轴的画笔 (+P) [black] 和滑动三角的填充色 (+g) [red] , 三角大小为轴宽的两倍,字体大小为轴宽的三倍。

关于 d-f 指示器:如果使用百分比标注 (+ap),则轴上显示标注,否则无标注。 这些指示器对所有 justify 代码均保持水平,除了 MLMR 。 对于静止线条,其默认线宽为指示器大小的 2.5% 和 8p 的二者较小值 (指示器 f 为 1.5% 和 3p)。

如果不指定指示器大小 (+w),对于圆形指示器,默认大小为画布最大边长的 5% ; 对于轴状指示器,默认长度为 +j 指定画布边的边长的 60% 。

片头和淡入淡出

https://docs.generic-mapping-tools.org/latest/_images/GMT_title_fade.png

整个动画的淡化水平 (0 为全黑, 100 为全部可见) ,包含一个可选的片头。

整个动画可以有一个可选的片头(-E),其时长 duration 由用户设定。 在该时长的开头和/或结尾部分,可以指定使用指定的淡化颜色 [black] 进行淡入/淡出处理。 主动画部分也可以有可选的淡入/淡出部分(-K), 在此选项中,用户可以选择在动画上进行淡入/淡出处理,或者可以将第一个和/或最后一个动画帧冻结, 仅对这些静态图像进行渐隐处理(通过子选项 +p)以保留整个动画序列。

其它电影格式

按照设置,对于电影格式, movie 模块仅提供了 MP4 和 WebM 格式。 转换工作由工具 FFmpeg 完成,该工具拥有海量的编码器和处理选项。如果用户希望使用其他选项运行 FFmpeg,请使用两种视频格式之一来运行 movie。 最后它会打印出使用的 FFmpeg 命令。 用户可以复制、粘贴并修改此命令以选择其他编码器、比特率和参数。 用户还可以将生成的 PNG 序列作为输入传递给诸如 QuickTime Player、iMovie、MovieMaker 等商业程序或其他工具,从而以这种方式制作电影。

基于已有的 PNG 帧重新制作电影

当用户在制作好电影后,决定改变帧率,或者调整电影中所有静止图像的组合方式。 如果用户保留了所有的帧图像,那么不必重新运行整个渲染过程。 假设用户想要一个 MP4 电影,并且只是想要重新运行ffmpeg命令,这里有一个例子:

ffmpeg -loglevel warning -f image2 -framerate 24 -y -i "mydir/myimages_%04d.png" -vcodec libx264 -pix_fmt yuv420p mymovie.mp4

movie 执行时,也会打印此命令。对于其他电影格式,需要查阅 FFmpeg 文档。 注: 在 Windows 上,百分比符号是特殊字符(就像shell下的美元符号), 所以用户需要输入两个(%%)。

操作多个电影

如果用户正在制作一系列相似的电影,可以使用 FFmpeg 在空间上将它们拼成一部电影。 假设有四个电影片段,分别名为 movie_1.mp4、movie_2.mp4、movie_3.mp4 和 movie_4.mp4, 而用户希望将它们组合成一个 2x2 的面板,以便同时展示这四个影片。首先,需要将片段(1,2)和(3,4)水平拼接在一起,然后将这两个拼接后的片段垂直拼接起来:

ffmpeg -i movie_1.mp4 -i movie_2.mp4 -filter_complex hstack=inputs=2 top.mp4
ffmpeg -i movie_3.mp4 -i movie_4.mp4 -filter_complex hstack=inputs=2 bottom.mp4
ffmpeg -i top.mp4 -i bottom.mp4 -filter_complex vstack=inputs=2 four_movies.mp4

有关此类操作的更多信息,请参阅 FFmpeg 文档。

macOS 问题

在 macOS 系统中,默认情况下限制同时打开文件的数量相对较小。 当同时构建大量帧时,出现 “打开文件过多” 错误而导致影片制作失败的情况并不罕见。 GMT 建议用户参考这篇有用的 文章 以获取各种解决方案。

示例

: 下面是该模块的一些有效语法示例。使用远程文件(文件名以 @ 开头)的示例可以剪切并粘贴到您的终端中进行测试。其他需要输入文件的命令只是常见的使用类型的虚拟示例,但不能按编写的原样运行。

以下是通过不断改变中心经度以实现制作旋转地球的简单示例,其中自定义一个像素大小为 600x600 的方形区域,帧数为 360 帧,在左上角放置一个帧计数器,在右上角放置一个进度指示器。 该示例不需要自定义输入数据文件,可在本地运行。

首先创建主脚本 globe.sh

gmt begin
    gmt coast -Rg -JG${MOVIE_FRAME}/20/${MOVIE_WIDTH} -Gmaroon -Sturquoise -Bg -X0 -Y0
gmt end

再使用 movie 模块生成 GIF 动图:

gmt movie globe.sh -Nglobe -T360 -Fgif -C6ix6ix100 -Lf -P

在执行过程结束时,用户会发现了 GIF 文件 globel.gif 以及一个目录 glob , 其中包含了全部 360 张 PNG 图片。请注意, globe.sh 脚本中没有包含任何反映图表名称、 画布大小、栅格化 PostScript 的尺寸等信息的内容。 这些信息对用户是隐藏的;实际执行的 movie 脚本是根据用户提供的脚本生成的, 并提供了额外的机制。 movie 模块会自动使用所有可用的核心来管理对所有帧的并行执行循环。

更多示例

弃用

  • 6.3.0: Consolidate -A into -F for a more unified option. #5613

参考文献

Wessel, P., Esteban, F., & Delaviel-Anger, G. (2024). The Generic Mapping Tools and Animations for the Masses. Geochemistry, Geophysics, Geosystems, 25(6). https://doi.org/10.1029/2024GC011545

相关模块

gmtmath, grdinterpolate, grdmath, events