製作動畫¶
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