制作动画¶
GMT提供了 movie 模块用于简化制作动图的流程。
动画本质上将一系列静态的图片(每张静态图片称为动画的一帧)按照顺序快速切换。 movie 模块的作用就是生成一系列静态图片,并利用外部工具将所有图片合并转换成单个动图。
一张动图中有很多不变的元素,比如底图、海岸线、图例等。通常来说,一张动图可以分为三个图层:
- 静态的背景图层(可选)
- 动态元素图层(必须)
- 静态的前景图层(可选)
用户需要准备一至三个GMT脚本,分别用于绘制三个图层。其中,绘制动态元素图层所需的脚本中可以使用一系列GMT预定义的变量。
GMT生成动画的基本流程是:
- 调用第一个脚本生成静态背景图层
- 调用第三个脚本生成静态前景图层
- 调用第二个脚本生成中间的动态元素所在的图层
- 将静态背景图层、中间动态图层和静态前景图层按照顺序叠在一起,得到一帧静态图片
- 循环执行第3和第4步,得到动图所需的所有帧静态图片
- 调用外部工具将所有静态图片合并转换为动图图片
绘制正弦函数动画¶
#!/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
绘制旋转的地球¶
本例中绘制了一个旋转的地球动画,图上展示了地壳的的年龄。
#!/usr/bin/env bash
# 绘制静态背景图层的脚本并生成绘图过程中需要使用的数据
cat << EOF > pre.sh
gmt begin
gmt math -T0/360/5 -I T 5 SUB = longitudes.txt
gmt makecpt -Cdem2 -T0/6000 -H > t.cpt
gmt grdgradient @earth_relief_20m -Nt1.25 -A45 -Gintens.nc
gmt end
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 -Ct.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