可視化の原理
基盤共通アーキテクチャ
このアプリは「Pythonサーバ(データの取得・整形)」と 「ブラウザのGPU(描画とシミュレーション)」の二層でできています。 サーバは気象庁・国土地理院・衛星データの各APIから生データを取り寄せ、 ブラウザが扱いやすいJSONや画像(テクスチャ)に変換して渡します。
3D地形 — 標高タイルの解読
ベースの地形は国土地理院の標高タイル(dem_png)から作ります。これは標高値を
PNGのRGB値に符号化した特殊な画像で、1ピクセルごとに
標高 = (R×65536 + G×256 + B) × 0.01 m と解読できます。
鹿児島周辺の約40枚のタイルをつなぎ合わせて解読し、512×512分割の3Dメッシュを持ち上げ、
同じ標高データをGPUにも渡して「粒子が地面に当たったか」の判定に使います。
高さは視覚効果のため2.3倍に誇張しています。
GPUパーティクル — 数十万個を毎秒60回動かす仕組み
降灰52万個・海流26万個という粒子数は、CPUで1個ずつ計算していたら間に合いません。 そこでGPGPU(GPUによる汎用計算)を使います。ポイントは 「粒子の状態を画像として持つ」ことです。
1024×512ピクセルの浮動小数点テクスチャを用意すると、各ピクセルのRGBAに 「粒子1個の位置(x, y, z)と年齢」を記録できます(1024×512 = 524,288粒子)。 毎フレーム、GPUのシェーダ(画像処理プログラム)がこの「状態画像」を読み、 風で流し・重力で沈め・寿命が来たら火口に戻す、という計算をして 新しい状態画像に書き出します。これを2枚のテクスチャで交互に繰り返すので 「ピンポン・テクスチャ」と呼ばれます。描画時は各粒子がこの画像から自分の位置を 読み取って光る点として表示されます。すべてGPU内で完結するため、 52万粒子でも60fpsで動きます。
前提データの時点・更新間隔と、演出との境界
「画面に出ている値はいつ時点のものか」は、可視化を読み解くうえで最初に確認すべき点です。 元データが作られる間隔、サーバのキャッシュ、クライアントの再取得間隔が積み重なって 画面に届くまでの遅れになります。
データ別の一覧
| データ | 提供元 | 元データの間隔 | サーバのキャッシュ | 画面の再取得 | 画面に出る値の時点 |
|---|---|---|---|---|---|
| 降灰予報(定時)VFVO53 | 気象庁 防災情報XML | 1日数回の定時発表 | 5分 | 5分ごと | 直近の発表(発表時刻をHUDに表示) |
| アメダス 風向・風速 | 気象庁 bosai API | 10分値 | 60秒 | 60秒ごと | 概ね5〜15分前の実測(観測時刻をHUDに表示) |
| 標高タイル | 国土地理院 | ほぼ更新なし | 24時間 | 起動時のみ | — |
| Sentinel-2 L2A | AWS Open Data (Earth Search) | 同一地点は2〜3日おきに撮像 | 6時間 | 起動時のみ | 直近の低雲量シーン(撮像日時をHUDに表示) |
| 地表面温度 Landsat 8/9 C2 L2 ST_B10 |
USGS / Microsoft Planetary Computer | 同一地点を8〜16日おきに撮像 | 6時間 | 起動時のみ | 直近で桜島上空が晴れていた撮像(日時をHUDに表示) |
| 地表面温度 Sentinel-3 SLSTR L2 LST |
Copernicus / Microsoft Planetary Computer | ほぼ毎日通過(昼・夜) | 3時間 | 起動時のみ | 直近の日中(現地9〜15時)の便(日時をHUDに表示) |
| 海面水温 MUR | NASA JPL / CoastWatch ERDDAP | 日次 | 3時間 | 起動時のみ | 1〜2日前の解析値 |
| クロロフィルa VIIRS | NOAA / CoastWatch ERDDAP | 日次(DINEOF)、欠測時は週間合成 | 3時間 | 起動時のみ | 1〜3日前 |
| 海面流速(地衡流) | NOAA CoastWatch(衛星高度計ブレンド) | 日次NRT | 3時間 | 起動時のみ | 1〜3日前 |
| 海面流速(SMOC) 登録制・任意 |
Copernicus Marine(CMEMS) | 毎時(潮汐流込み) | 3時間 | 起動時のみ | 約1時間前(設定時はこちらが優先) |
| 海面水温(ひまわり9号) 登録制・任意 |
JAXA ひまわりモニタ(P-Tree) | 毎時 | 3時間 | 起動時のみ | 約1時間前(雲域はMURで補完) |
| 潮位(鹿児島) | 気象庁 潮位表 | 毎正時の推算値・年間表 | 6時間 | 6時間ごと | 現在時刻に内挿(推算値なので遅れなし) |
下2行は無料登録が必要な任意のソースです。認証情報を設定したときだけ有効になり、 取得できなければ自動的に上の無認証データへ戻ります。 いまどちらを使っているかは、画面右上の「海流」欄と凡例下部の「データ時点」に出ます。
「黒潮・海況」は同時刻の姿ではない — 合成表示であること
海況タブの3つの層(海面水温・クロロフィルa・海面流速)は、 別々の衛星が別々のタイミングで観測したものです。それぞれ「取得できる最新」を使うため、 重ね合わせた画は厳密には同時刻には存在しなかった合成になります。
| 層 | 観測の仕組み | 典型的な遅れ | なぜその遅れになるか |
|---|---|---|---|
| 海面水温 MUR | 複数衛星の日次解析 | 1〜2日 | 複数センサを統合して格子化する処理に時間がかかる |
| クロロフィルa VIIRS | 極軌道衛星の可視光 | 1〜3日 | 昼間・雲なしでしか測れない。1日1回の通過を待ち、欠測はDINEOFで補完する |
| 海面流速 | 衛星高度計から計算する地衡流 | 1〜3日 | 複数の高度計の軌道データを集めて日次で合成する |
新しさを取るか、時刻の整合を取るか — ?ocean=
この2つは同時には満たせません。URLパラメータで切り替えられるようにしています。
| モード | 取得の仕方 | 実測例(2026-08-22 12時時点) | 向いている用途 |
|---|---|---|---|
?ocean=latest(既定・省略可) |
各層それぞれの最新 | 水温 8/20 09Z / 藻類 8/19 12Z / 海流 8/19 00Z 時刻差 33時間 |
できるだけ新しい海況を見たいとき |
?ocean=aligned |
3層に共通して存在する最新日に揃える | すべて 8/19(09Z / 12Z / 00Z) 時刻差 12時間(水温は1日古くなる) |
展示で「同じ日の海」として説明したいとき |
整合モードは、まず3データセットの時間軸の末尾を問い合わせて
(?time[last-7:last])、日付集合の共通部分の最大値を取り、
各データセットのその日の時刻を指定して本取得します。
共通日が見つからないときは自動的に既定の動作へ戻ります。
海洋分野では、こうした合成(コンポジット)は水温分布や渦の位置を見るうえで 一般的な手法です。水温場や中規模渦は数日スケールでしか変わらないため、 1〜2日の開きは大きな構造の把握を妨げません。問題になるのは 「合成であることを明示せずに、瞬間の観測であるかのように見せる」場合です。 そのため本アプリでは各層の観測時刻と時刻差を常時表示しています。
より実時間に近づける手段(登録制データソース)
無認証で使えるデータには上表の遅れがありますが、無料登録すれば毎時のデータに置き換えられる
層が2つあります。実装済みで、環境変数に認証情報を与えたときだけ有効になります
(RUNNING.md §5.5)。
| 層 | 登録なし | 登録あり | 提供元 |
|---|---|---|---|
| 海面水温 | 日次MUR(1〜2日遅れ) | ひまわり9号 毎時SST(雲域はMURで補完) | JAXA ひまわりモニタ(P-Tree) |
| 海面流速 | 日次の地衡流(1〜3日遅れ) | SMOC 毎時・潮汐流込み(約9km格子) | Copernicus Marine(CMEMS) |
| クロロフィルa | 日次DINEOF(変更なし) | NOAA CoastWatch | |
curTidal が真のとき演出の振幅を下げています)。
実データ・モデル計算・演出の切り分け
| 画面の要素 | 種別 | 根拠・時点 |
|---|---|---|
| 地上付近の風(矢印・低高度の粒子の流れ) | 実測 | アメダス48地点(10分値) |
| 内挿した推定風(くすんだ色の矢印) | 実測からの補間 | 観測点の逆距離加重(IDW)。観測値そのものではない |
| 降灰予想域の琥珀色ライン | 予報 | 「いま噴火したら」という条件付き予測。実際の降灰の観測ではない |
| 上空の風向・風速(プルームの向き) | 予報からの逆算 | 選択中の3時間区間の予想域の重心方向と最遠距離÷3時間 |
| 噴火警戒レベル・見出し文 | 実データ | 気象庁の発表そのまま |
| 噴煙柱・火山灰の粒子・灰の堆積 | 演出 | 常時噴出。現在の噴火状況ではない |
| 干渉縞(震源・地殻変動・熱タブ) | モデル計算 | 茂木モデルによる理論計算。実際のInSAR観測画像ではない |
| 地表の熱異常(ネオンレッド) | 実測+演出 | Sentinel-2 SWIRの実データに、火口モデルの発光を重ねている |
| 海面水温・クロロフィルの色 | 実測 | 衛星解析値(1〜3日前) |
| 湾内の渦・微細な流れ | 演出 | 実測海流に、水温場から合成した細かい構造を重ねている |
画面上でも、降灰フロータブのタイトルパネル下部に 「噴煙・火山灰は常時流している演出」「灰の向き=どの時間帯に噴火した場合の予報か」 「地上の風=アメダス何時の実測か」を常時表示しています。
タブ①降灰フロー — 降灰予報 × 流体パーティクル
使っているデータ
| データ | 内容 | 可視化での役割 |
|---|---|---|
| 降灰予報(定時)VFVO53 気象庁 防災情報XML |
「いま噴火したら、3時間ごとにどこへ灰が降るか」の予想ポリゴン×6区間 | 琥珀色の予想域ライン/上空の風(プルームベクトル)の推定 |
| アメダス実況(10分毎) | 鹿児島・宮崎圏 約48地点の風向・風速 | 地上付近の風の場(明るいシアンの矢印が実測ベクトル。 くすんだ青灰色の矢印は、観測点の間をIDW補間した推定風です。 アメダスの風速計は地上約10mの高さですが、この縮尺では地面に埋もれるため 矢印は視認できる程度に浮かせて描いています) |
| 国土地理院 標高タイル | 地形の高さ | 3D地形・粒子の着地判定 |
風の場のつくり方 — 高度で2つのデータをブレンド
火山灰は高度によって違う風に流されます。このアプリでは:
- 低高度(〜0.4km): アメダス各地点の実測風を 逆距離加重(IDW)補間して64×64の「風の地図」テクスチャを作り、粒子を移流させます。 観測点に近いほどその観測値が強く効く、素直な空間補間です。
- 高高度(2.8km〜): 気象庁の予報ポリゴンから逆算します。 選択中の時間帯の降灰予想域の重心方向がプルームの向き、 最遠到達距離 ÷ 3時間が風速の目安です(例: 150km先まで予想 → 約14m/s)。
- その間の高度は両者をなめらかに混ぜます。
風ベクトルの見せ方 — 実測と内挿を色で分ける
画面上の矢印は2種類あり、どちらが観測値でどちらが計算値かが一目で分かるように 描き分けています。本数は毎分の更新ごとに凡例へ表示されます。
| 種類 | 本数の決まり方 | 見た目 |
|---|---|---|
| アメダス実測風 | 領域内で風向・風速が有効な観測所の数そのもの(現在48地点)。 1地点=1本なので、これが実測の上限です | 明るいシアン・太い |
| 内挿した推定風 | 粒子を動かしているのと同じIDW内挿場を約15km間隔で格子サンプル。 観測点から42km以上離れた格子点は内挿の根拠が乏しいので描きません(現在134本) | くすんだ青灰色・細い |
高さと、視点による自動調整
- 矢印の高さは誇張です。 アメダスの風速計は地上約10mですが、 東西約210kmを高さ2.3倍で描くこの縮尺では地面に埋もれてしまうため、 地表から0.15km(内挿ぶんは0.10km)だけ浮かせています
- カメラを水平に倒すと自動的に消えます。 山体の稜線や噴煙柱を横から観察するとき、 前景の矢印が視界を塞ぐためです。見上げ角22°以上で全表示、7°以下で消え、 その間は連続的にフェードします。操作パネルのトグルで完全に消すこともできます
粒子の一生
初速20〜75m/s+浮力で上昇 → ② 噴煙柱
乱流ノイズで渦巻く → ③ 風に乗って移流
高度別の風の場 → ④ 沈降
粒径ごとに0.4〜3.4m/s → ⑤ 着地・堆積
数秒光って再生成へ
それぞれの粒子は乱数で「粒の大きさ」を持ち、大きい粒ほど速く落ちます。 そのため火口の近くには重い粒が、遠くには軽い粒が届く——という実際の降灰の性質が 自然に再現されます。渦巻きの表現にはシンプレックスノイズ(滑らかな乱数場)を使っています。 時間は現実の約180倍速(可変)で進みます。
「降灰の蓄積」ヒートマップ
地表付近まで降りた粒子は、その位置を専用の堆積バッファ(上空から見た地図画像)に 少しずつ焼き込みます。バッファは毎フレームわずかに減衰するため、 「最近たくさん灰が積もった場所」ほど明るく残ります。これを インフェルノ配色(暗赤→橙→黄。量が増えるほど単調に明るくなる知覚均等な配色)で 地形に重ねることで、鹿児島市街や垂水・鹿屋方面への降灰集中が一目で分かります。
タブ②震源・地殻変動・熱 — 震源カタログ × 熱赤外 × GNSS
熱の分布 — 熱赤外で「地面そのものの温度」を°Cで測る
あらゆる物体は温度に応じた強さの赤外線を放っています(プランクの法則)。 波長10µm前後の熱赤外は、常温(0〜50°C程度)の地面がいちばん強く放つ帯域です。 衛星がこの放射の強さを測り、プランクの法則を逆に解いて温度に直したものが 地表面温度(LST: Land Surface Temperature)です。 このタブでは2つの衛星を切り替えられます。
| Landsat 8/9 | Sentinel-3 SLSTR | |
|---|---|---|
| 1マスの大きさ | 30m(細かい熱源が見える) | 1km(周りとならされる) |
| 同じ場所を通る間隔 | 8〜16日 | ほぼ毎日 |
| 画面に出るデータ | 数週間前になりやすい | 数日前 |
| プロダクト | Collection 2 Level-2 ST_B10 | Level-2 LST |
この2つは「細かさ」と「新しさ」のトレードオフの関係にあります。 どちらも°Cに校正された同じ量なので、同じ温度目盛りで色を比べられます。
雲を必ず取り除く理由
衛星が測るのは「上から見えた面」の温度です。雲があればそれは雲頂の温度で、 高い雲ほど冷たく、−20°C前後になります。これをそのまま描くと 「非常に冷たい地面」として色がつき、完全な誤読を生みます。そのため:
- Landsat — 同梱の
QA_PIXELのビット(雲・雲影・巻雲・拡散)を見て除外 - Sentinel-3 — 同梱の
cloud_inフラグで除外し、 さらに雲の縁は半分だけ雲がかかった中間の値になるため1画素分ふくらませて落とす
除外後に桜島周辺の有効画素が半分を切ったシーンは採用せず、次に新しいシーンへ移ります。 シーン全体の雲量ではなく桜島の上が晴れているかで判定するので、 「九州全体は曇りだが桜島だけ晴れ」という回も拾えます。
昼の便だけを使う
Sentinel-3は昼と夜の両方で同じ場所を通りますが、 晴れた日の地面は昼と夜で20°C近く違います。実測では同じ8月19日でも 夜間便の最高が28.9°C、日中便は41.4°Cでした。 色の比較が成り立たなくなるため、現地9〜15時の便だけを選んでいます。
震源の3D分布 — なぜここに火山があるのか
このタブの主役は地下の震源分布です。USGSの震源カタログ(FDSN Event Web Service、 登録不要・JSON)から鹿児島周辺の地震を取り、3D空間にそのまま置いています。 「地下ビュー」を押すと地形が半透明になり、地面の下を覗けます。
深さ分布に現れる構造
実際に取得したデータ(2011年以降・M2.5以上・802件)の深さヒストグラムです。
| 深さ | 件数 | 正体 |
|---|---|---|
| 0〜50 km | 619 | 地殻内の地震。活断層や火山周辺の活動 |
| 50〜125 km | 96 | 相対的に少ない空白帯 |
| 125〜180 km | 74 | 沈み込むフィリピン海プレート(和達–ベニオフ帯) |
| 180〜250 km | 13 | さらに深部へ続くスラブ |
画面を回して斜め下から見ると、深部の群れが面をなして北西へ傾いているのが分かります。 これが桜島の存在理由そのものです:
水が絞り出される → マントルの
融点が下がって融ける → マグマが上昇
姶良カルデラへ → 桜島の噴火
同じ画面に地表のGNSS実測変位も出しているので、 「地下で起きていること」と「地表に現れていること」を一枚で対比できます。
制約: USGSの世界カタログはM2.5程度以上しか収録していません。 桜島直下の微小地震(月に数百回)を見るには気象庁の一元化震源が必要です。
地殻変動 — GNSSの実測値で「いつからいつまで」を示す
現在このタブに表示している地殻変動は、国土地理院 GEONET の実測データです (日々の座標値・F5.1解)。干渉SARの縞と違い、本物の観測で、期間もはっきりしています。
| 項目 | 内容 |
|---|---|
| データ | 電子基準点の日々の座標値(F5.1解)。1996年以降、毎週更新 |
| 観測点 | 桜島・垂水・姶良・鹿児島2/3・鹿屋・喜入・大隅など16点 |
| 遅れ | 約6週間(IGS最終暦を待つため。速報のR5解より遅いが精度が高い) |
| 表示 | 水平変位=矢印(長さ=移動量)/上下変位=柱(暖色=隆起、寒色=沈降) |
なぜ「相対変位」にするのか
.posファイルの座標は ITRF2020の絶対位置で、 アムールプレートの運動(年3〜4cm)がそのまま入っています。 実際、2026年1〜6月の桜島は絶対値で東へ約21mm動いていましたが、 これはほぼ全てプレート運動です。
ばらつきへの対処
日々の座標値は1日ごとに水平で数mm、上下で1cm前後ばらつきます。 「ある1日」と「別の1日」の差を取ると、変位よりノイズが大きくなることがあります。 そこで両端それぞれ15日を平均してから差を取っています(ばらつきは約1/4に減ります)。
参考: 茂木モデルによる干渉縞(現在は非表示)
?mogi=1 を付けると復帰します。
以下はそのときの説明です。
InSAR — 電波の「位相」で数cmの地面の動きを測る
合成開口レーダ(SAR)衛星は地表に電波を当てて反射を受け取ります。 同じ場所を2回撮影して電波の位相(波のずれ)を比べると、 その間に地面が衛星方向に何cm動いたかが分かります。これが干渉SAR(InSAR)です。 位相は1波長ごとに一周してしまうため、変位マップは 「縞1周期 = 半波長分の変位」という虹色の等高線(干渉縞)として現れます。
| バンド | 衛星 | 波長 | 縞1周期の変位 |
|---|---|---|---|
| Cバンド | Sentinel-1 | 5.55cm | 2.8cm(縞が細かい=高感度) |
| Lバンド | だいち2号 (ALOS-2) | 24.2cm | 12.1cm(縞が粗い=植生に強い) |
「視線方向」とはどちらか
InSARが測れるのは衛星と地面を結ぶ直線に沿った成分だけです
(3次元の動きのうち1成分しか分かりません)。本アプリで使っている視線ベクトルは
uLos に定義してあり、正規化すると次のようになります。
衛星が東側の空にある配置なので、極軌道衛星の上昇軌道(アセンディング)に あたります。各成分の重みは、地面の動きがどれだけ縞に効くかを決めます。
| 地面の動き | LOS変位への寄与 | 意味 |
|---|---|---|
| 真上へ1cm 隆起 | +8.1 mm | 最もよく効く。縞の主因 |
| 東へ1cm 水平移動 | +5.8 mm | 衛星に近づくので正 |
| 北へ1cm 水平移動 | −1.0 mm | ほとんど効かない |
茂木モデル — マグマだまりの膨張を数式ひとつで
桜島の地下では、姶良カルデラ(錦江湾北部)の深さ約10kmにマグマの供給源があると 考えられています。地下の点状の圧力源が膨らんだときの地表の隆起は、 火山学で広く使われる茂木モデル(1958年、茂木清夫)で計算できます:
このアプリでは深部ソース(姶良カルデラ下 約10km)と 浅部ソース(南岳直下 約4km)の2つを置き、各画素で隆起・水平変位を計算 → 衛星の視線方向に射影 → 半波長で折り返して虹色に変換、という処理を GPUが毎フレーム実行しています。だからスライダーで膨張量ΔVや深さを動かすと、 縞がリアルタイムに増減します。深いソースはなだらかで広い縞を、 浅いソースは急峻で細かい縞を作る——という関係が直感的に確かめられます。
この縞に「期間」はない
実際の観測との読み分け
| 実観測のInSAR(例: 熊本地震) | 本タブ | |
|---|---|---|
| データ | SAR衛星が2回撮影した位相差 | 観測データなし(理論計算) |
| 時間 | 2つの撮影日の間の変位 | 期間の概念がない |
| 縞1周期 | 半波長のLOS変位 | 同じ(表示の約束は共通) |
| 模様 | 断層で縞が不連続に途切れる/ノイズ・大気遅延を含む | なめらかな同心円のみ。断層は表現できない |
同心円状の縞=火山の膨張、途切れた縞=断層のずれという読み分けは、 実際のInSAR画像と本タブを並べて説明する教材として使えます。
タブ③黒潮・海況 — 海面水温 × クロロフィル
1変数=1チャネル: 色は水温、ドットはプランクトン
水温とプランクトン量を両方とも「色」で塗ると、値の組み合わせによって 混ざり合いどちらとも読めない色が生まれます。そこで視覚チャネルを分離しています:
- 海面水温 → 色: 冷たい水は深い藍、暖かい黒潮系の水は金色(明度単調ランプ)
- クロロフィルa → テクスチャ(緑の小ドットの密度): ドットがある場所=プランクトンがいる海域で、濃度が高いほど密になる (スティップル表現。色はクロロフィルの緑)
植物プランクトンのクロロフィルa色素は青い光を吸収するため、 衛星の海色センサ(NOAA VIIRSなど。しきさい/GCOM-Cと同系の観測)で 濃度[mg/m³]が推定できます。濃度は外洋0.05mg/m³から沿岸ブルームの10mg/m³超まで 桁で変わるので対数スケールで扱い、ドット密度の割り当ては 取得した実データの分布(この海域の5〜95パーセンタイル: 約0.16〜4.9mg/m³)に較正しています。 ドットは世界座標約1.6km格子に乱数配置し、遠景ではエイリアシングを避けるため 淡い面表現に溶け込ませます。データは日次のDINEOFギャップフィル(雲の欠測を統計的に補完した ほぼリアルタイムのプロダクト)を使い、取得できない場合は週間合成にフォールバックします。
見えない流れを描く — 実測海流と推定流の合成場
まず実測海流の側を見ます。設定によって2つのうちどちらかになります。
| ソース | 格子・周期 | 潮汐流 | 使われる条件 |
|---|---|---|---|
| 衛星高度計ブレンドの地衡流 (NOAA CoastWatch) |
0.25°(約25km)・日次 | 含まない | 既定 |
| 海洋解析SMOC (Copernicus Marine) |
1/12°(約9km)・毎時 | 含む | CMEMSの認証情報を設定したとき |
どちらも格子が粗く、湾内や小さな渦を解像できません (SMOCの1/12°≒9kmに対し、錦江湾の幅は約20km。湾を横切る格子はわずか2〜3点)。 そこで海面水温(約1km解像度)から流れを推定して足します。 根拠は海洋物理の性質です: 大きなスケールの海流は水温フロント (温度の境目)に沿って流れます(地衡流平衡)。そこで:
どちらがどれだけ効いているか — 実測して確かめる
αが大きいため、実際には第2項のほうが優勢です。配信中のデータで両項の大きさを 測った結果がこちらです(平滑化スケールを変えても傾向は変わらず、 画素スケールのノイズによる見かけの結果ではありません)。
| 評価スケール | ① 実測海流の項 | ② SST勾配の項 | 実測の割合 |
|---|---|---|---|
| 平滑化なし(画素スケール) | 0.269 | 1.373 | 16% |
| 10km平滑化 | 0.268 | 1.126 | 19% |
| 25km平滑化 | 0.266 | 0.838 | 24% |
| 錦江湾内のみ | 0.134 | 1.243 | 10% |
flow_real_fraction() がシェーダと同じ式で)測り直し、
画面の「データ時点」欄に「実測由来は約○%」として表示します。
係数を変えれば表示も自動で追随するため、説明文と実装がずれません。
したがって、この可視化の読み方は次のようになります。
- 黒潮本流の位置と大まかな向き — 実測に近い。①が担っています
- 湾内や沿岸の細かい渦 — 実際の海の観測ではありません。 物理法則にもとづく推定と演出です
- 流れる速さ・潮の向きが変わるタイミング — 実際とは対応しません。
アニメーションは現実の約300倍速(スライダーで可変)、
潮汐の周期も
sin(uT×0.09)という架空の周期で、実際の潮汐表とは無関係です
これに次の成分を加えて流れの場が完成します:
- 湾口の潮汐渦: 錦江湾の入り口に、向きを変える渦を配置します。
位相は気象庁 潮位表(鹿児島)の実データから取ります(次項)。
振幅は、日次の地衡流を使っているときは 0.55、
潮汐流を含むSMOCを使っているときは実データの寄与を主にするため
0.15 に自動で下げます(サーバが返す
curTidalフラグで切り替え) - ノイズ成分: 小さな乱流のゆらぎ
潮汐の位相 — 潮位そのものではなく「変化率」で駆動する
錦江湾は湾口が狭く奥が深い地形です。湾に出入りする流量は、湾内の水位が 単位時間にどれだけ変わるか(dη/dt)でほぼ決まります。したがって潮流は 潮位そのものではなく潮位の変化率に比例し、満潮・干潮の前後が憩流(流れが止まる)、 その中間で最速になります。
そこで気象庁の潮位表(鹿児島, KG)から毎正時の推算潮位を取得し、
現在時刻に内挿して変化率を求め、渦の駆動値 uTide(−1〜+1)にしています。
正なら上げ潮、負なら下げ潮です。正規化には期間内の変化率の95%点を使い、
大潮でおおむね ±1 に収まるようにしています。
sin(uT × 0.09) という架空の周期でした。
現在は実際の干満と同期しており、画面右上の「潮汐(鹿児島)」欄に
そのときの潮位と上げ潮/下げ潮/憩流が表示されます。潮位表は天文潮位の推算値(過去の観測から調和分解して計算した予測)なので、 気圧・風による偏差は含みません。また観測データではないため、遅れはありません。
流線が「生きた抽象画」になる仕組み
26万個の粒子をこの流れ場で漂わせ、各粒子の軌跡を減衰するトレイルバッファ (毎フレーム4%ずつ暗くなる画像)に焼き込みます。粒子が同じ筋を通り続ける場所は 明るい「流線」として浮かび、流れが変わると古い線は数秒で消えます。 速い流れだけが光るよう流速でゲートしているため、 黒潮本流や渦の縁だけがリボン状に発光し、静かな湾内は水温の地色が透けます。 流線と粒子は中立の淡い白で描き、水温の色と混ざらないようにしています。 薄く重ねた等温線(0.125°C間隔)が、色では見えにくい水温の微細な構造を補います。
共通「光る」表現の正体 — 加算合成とブルーム
3つのタブに共通する「暗闇に光が滲む」ルックは、2つの描画技法の組み合わせです。
- 加算合成(Additive Blending) — 粒子を重ねるとき色を「足し算」します。 粒子が密集した場所ほど自動的に明るく白へ近づくため、 明るさ=濃度という正直な対応が生まれます。降灰の濃いエリアが 黄白色に輝くのはこの効果です。
- ブルーム(Unreal Bloom) — 一定より明るい部分だけを抽出してぼかし、 元の画像に重ねる後処理です。強い光が周囲へ滲む「グロー」が生まれます。 閾値を調整し、暗い地形は滲まず、噴煙柱・火口・黒潮のリボンだけが光るようにしています。
- ACESトーンマッピング — 映画で使われる階調変換で、 強い光が白飛びせずに豊かなオレンジ〜白のグラデーションに収まります。
ベースの地形をほぼ黒(ダークカートグラフィ)に抑えているのは、 これらの光の表現のダイナミックレンジを最大化するためです。 等高線・海岸線だけをわずかに発光させ、地図としての読み取りも保っています。