14.3 制作动画

GMT提供了 movie 模块用于简化制作动图的流程。

动画本质上将一系列静态的图片(每张静态图片称为动画的一帧)按照顺序快速切换。 movie 模块的作用就是生成一系列静态图片,并利用外部工具将所有图片合并转换成单个动图。

一张动图中有很多不变的元素,比如底图、海岸线、图例等。通常来说,一张动图可以分为三个图层:

  1. 静态的背景图层(可选)
  2. 动态元素图层(必须)
  3. 静态的前景图层(可选)

用户需要准备一至三个GMT脚本,分别用于绘制三个图层。其中,绘制动态元素图层所需的脚本中可以使用一系列GMT预定义的变量。

GMT生成动画的基本流程是:

  1. 调用第一个脚本生成静态背景图层
  2. 调用第三个脚本生成静态前景图层
  3. 调用第二个脚本生成中间的动态元素所在的图层
  4. 将静态背景图层、中间动态图层和静态前景图层按照顺序叠在一起,得到一帧静态图片
  5. 循环执行第3和第4步,得到动图所需的所有帧静态图片
  6. 调用外部工具将所有静态图片合并转换为动图图片

14.3.1 绘制正弦函数动画

#!/usr/bin/env bash

# 绘制静态背景图层的脚本
cat << EOF > pre.sh
gmt math -T0/360/20 T SIND = sin_point.txt
gmt math -T0/360/2 T SIND = sin_curve.txt
gmt begin
    gmt basemap -R0/360/-1.2/1.6 -JX3.5i/1.65i -X0.35i -Y0.25i \
    -BWSne+glightgreen -Bxa90g90f30+u'\232' -Bya0.5f0.1g1 --FONT_ANNOT_PRIMARY=9p
gmt end
EOF

# 绘制动态元素图层的脚本
cat << EOF > main.sh
gmt begin
#   Plot smooth blue curve and dark red dots at all angle steps so far
    last=\`gmt math -Q \${MOVIE_FRAME} 10 MUL =\`
    gmt convert sin_curve.txt -Z0:\${last} | gmt plot -W1p,blue -R0/360/-1.2/1.6 -JX3.5i/1.65i -X0.35i -Y0.25i
    gmt convert sin_point.txt -Z0:\${MOVIE_FRAME} | gmt plot -Sc0.1i -Gdarkred
#   Plot bright red dot at current angle and annotate
    gmt plot -Sc0.1i -Gred <<< "\${MOVIE_COL0} \${MOVIE_COL1}"
    printf "0 1.6 a = %3.3d" \${MOVIE_COL0} | gmt text -F+f14p,Helvetica-Bold+jTL -N -Dj0.1i/0.05i
gmt end
EOF

# movie 模块调用了 pre.sh 和 main.sh 脚本以生成动画
# 生成动画
gmt movie main.sh -Sbpre.sh -C4ix2ix125 -Tsin_point.txt -Z -Nanim01 -D5 -A+l
# 将动画中的一帧保存为静态图片
gmt movie main.sh -Sbpre.sh -C4ix2ix125 -Tsin_point.txt -Z -Nanim01 -D5 -M10,png -Fnone
../../_images/anim01.gif

14.3.2 绘制旋转的地球

本例中绘制了一个旋转的地球动画,图上展示了地壳的的年龄。

#!/usr/bin/env bash

# 绘制静态背景图层的脚本并生成绘图过程中需要使用的数据
cat << EOF > pre.sh
gmt math -T0/360/5 -I T 5 SUB = longitudes.txt
gmt makecpt -Cdem2 -T0/6000 > movie_dem.cpt
gmt grdgradient @earth_relief_20m -Nt1.25 -A45 -Gintens.nc
EOF

# 生成绘图主脚本
cat << EOF > main.sh
gmt begin
	# Let HSV minimum value go to zero
	gmt set COLOR_HSV_MIN_V 0
	# Fake simulation of sun illumination from east combined with relief slopes
	gmt grdmath intens.nc X \${MOVIE_COL1} SUB DUP -180 LE 360 MUL ADD 90 DIV ERF ADD 0.25 SUB = s.nc
	# Plot age grid first using age cpt
	gmt grdimage @age.3.20.nc -Is.nc -C@crustal_age.cpt -JG\${MOVIE_COL0}/0/6i -X0 -Y0
	# Clip to expose land areas only
	gmt coast -Gc
	# Overlay relief over land only using dem cpt
	gmt grdimage @earth_relief_20m -Is.nc -Cmovie_dem.cpt
	# Undo clipping and overlay gridlines
	gmt coast -Q -B30g30
gmt end
EOF

# 制作动画
gmt movie main.sh -Sbpre.sh -C6ix6ix100 -Tlongitudes.txt -Nanim02 -H2 -Z -A+l
gmt movie main.sh -Sbpre.sh -C6ix6ix100 -Tlongitudes.txt -Nanim02 -H2 -Z -M10,png -Fnone

rm -rf main.sh pre.sh
../../_images/anim02.gif