ブラウザに本物の夜空を描く

用語集

本文で注の付く語を、天文・描画・Web・Asterarium独自の4つに分けて一覧にします。


天文描画Webと開発Asterarium独自の用語

各分類の中は見出し語の読みの五十音順です。ラテン文字で始まる語(B−V色指数、ECEF、J2000など)は先頭に置いてあります。

天文

B−V色指数
青いフィルタを通して測った明るさと、黄色いフィルタを通して測った明るさの差です。値が大きいほど赤い星、小さいほど青い星で、星の表面温度の目安になります。
ECEF
地球に固定した直交座標系で、原点が地球の中心、Z軸が自転軸、X軸が経度0度の方向を向きます。名前はEarth-Centered, Earth-Fixedの略です。
F型星
星を表面温度で分類したときの一段で、太陽より少し熱く、白っぽく見える星です。表面温度はおよそ6,000から7,500Kにあたります。
J2000
天体の座標がいつ時点のものかを示す基準時刻、すなわち元期の一つで、世界時2000年1月1日正午を指します。星のカタログの座標は、多くがこの元期で書かれています。
位相角
天体そのものの位置から見た、太陽と観測者のなす角度です。月では0度が満月、180度が新月にあたります。円盤の光っている割合はこの角度で決まりますが、満ちる途中か欠ける途中かは区別できません。
オーラリー
太陽系の惑星の公転を、模型として動かして見せる装置のことです。Asterariumではその名を借りて、惑星の軌道と現在位置を上から見せる独立したページを指します。
輝縁
欠けた月や惑星の、光っている側の縁のことです。輝縁は、天球上で太陽のある側を向きます。その向きを角度で言うのが輝縁の位置角で、明るい縁の中央が向く方向を、天の北から東回りに測ります。
輝面比
天体の見かけの円盤のうち、光って見える部分の面積の割合です。0が新月、0.5が上弦や下弦の半月、1が満月にあたります。
級数展開
時刻の多項式と三角関数の和として書き下した、天体の位置を近似する式です。式そのものが答えを出すので、あらかじめ計算した位置の表を読み込む必要がありません。
元期
座標や軌道の値が、いつ時点のものかを示す基準時刻です。天文の座標で代表的な元期がJ2000です。
黄経
太陽の1年の通り道である黄道に沿って、春分点(黄道と天の赤道が交わる点)から東回りに測った角度です。月や惑星の位置を扱うときの自然な経度になります。
光行差
観測者自身の運動によって、光の来る向きが観測者の進行方向へわずかに傾いて見える現象です。地球の公転によるずれは最大で約20秒角、つまり1度の180分の1ほどです。
恒星時
春分点(天の赤道と太陽の通り道が交わる点)を基準にした地球の自転角を、時刻の形で表したものです。角度を時間の単位で言い換えたものなので、24時間が360度、1時間が15度にあたります。星が空のどこに見えるかは、太陽ではなくこの値で決まります(暦の上での話で、実装がこの値を直接使うかどうかは別です)。
高度
観測者の地平線から測った、天体の上向きの角度です。0度が地平線、90度が真上の天頂で、負の値は地平線の下にあることを意味します。
黒体放射
熱を持った物体が、その温度だけで決まる色と強さで出す光のことです。温度が高いほど青く、低いほど赤くなるので、星の色を温度から近似する土台になります。
固有運動
恒星が天球上を年々わずかに移動していくことです。全天で最も速いバーナード星でも1年に約10秒角、1度の360分の1ほどしか動きません。そのバーナード星も9.5等と暗く、8等より明るい星だけを載せたこの記事のカタログには含まれていません。
歳差
地球の自転軸の向きが、約2万6000年かけて円を描くようにゆっくり変わる現象です。空の座標の起点である春分点もこれにともなって動くため、星の座標も少しずつ変わります。
視差
観測する位置が変わると、天体の見える向きも変わることです。星までの距離を測るのに使うのは年周視差、つまり地球の公転にともなう1年周期のずれで、最も近い恒星でも1秒角(1度の3600分の1)に満たない小さな角です。描画で位置のずれとして効くのはもう一方の日周視差、すなわち観測者が地球の中心ではなく地表にいることで生じるずれで、月では最大約1度に達します。
視半径
天体の見かけの大きさを角度で表したもので、円盤の半径にあたる角度です。太陽と月はどちらも視半径が約0.25度、つまり直径にすれば約0.5度でほぼ等しくなっています。月と地球の距離は一定ではないので月の視半径は前後し、月が大きいときの日食は太陽を覆い隠す皆既日食に、小さいときは縁が輪に残る金環日食になります。
春分点
空の上で、天の赤道(地球の赤道を空へ延ばした線)と太陽の1年の通り道が交わる2点のうち、太陽が南から北へ横切る方の点です。空で経度にあたる角度は、この点を0度の起点として測ります。
深宇宙天体
恒星と太陽系の天体を除いた、星雲・星団・銀河といったぼんやり広がって見える天体の総称です。多くは肉眼では見えず、双眼鏡や望遠鏡で見ます。
赤緯
天の赤道(地球の赤道を空へ延ばした線)を0度として、北を正、南を負に±90度まで測る角度で、緯度にあたります。
赤経
天の赤道(地球の赤道を空へ延ばした線)に沿って、春分点(天の赤道と太陽の通り道が交わる点)から東回りに測る角度で、経度にあたります。慣習として時分秒で書き、24時が360度にあたります。
赤道座標
地球の赤道と自転軸を空へ延ばして張る座標系です。位置は、経度にあたる赤経と緯度にあたる赤緯の2つの角度で表します。地球の自転とともには回らないので、恒星の値はほぼ一定です。
測地座標
地球上の位置を、緯度・経度・標高の3つで表す言い方です。標高は真球ではなく、地球のわずかに扁平な形を近似した回転楕円体の面から測ります。
大気差
地球の大気が光を曲げるために、天体が実際の位置より高く見える現象です。持ち上がる量は地平線付近で最も大きく、約34分角(0.57度)に達します。
大気散乱
太陽の光が大気中の分子や粒子にぶつかって、あらゆる向きへ散らばる現象です。青い光ほど強く散らばるので昼の空は青く、低い太陽の光は長い距離の大気を通るので朝夕は赤くなります。
地平座標
観測者の地平線を基準にした座標系で、位置を、真北から測る方位と、地平線から測る高度という2つの角度で表します。同じ星でも、場所や時刻が変われば値が変わります。
天球
天文学で、星の見える向きを表すために考える、観測者を中心とした仮想の球面です。距離は持たず、星までの本当の距離は捨てて、どの向きに見えるかだけを扱います。この記事では、その天球を表す3Dシーンの入れ物も同じ名前で呼び、シーンの1単位が約1メートルにあたるので、半径1000、およそ1kmの球面に星を置いています。
天体暦
天体の位置を時刻ごとに並べた表、またはその位置を計算するモデルのことです。どの天体暦を使うかで、同じ時刻の位置がわずかに違ってきます。
等級
天体の明るさを表す数値で、小さいほど明るく、1等級の差が約2.512倍の明るさにあたります。肉眼で見える限界は、暗い空でおよそ6等から6.5等です。
当日基準の座標
その時点の地球の赤道と春分点(天の赤道と太陽の1年の通り道が交わる点)を基準にして表した座標です。地球の自転軸の向きがゆっくり変わるため、2000年時点の基準にそろえたJ2000の座標とは、年が離れるほど値がずれていきます。星図やカタログはJ2000で書かれ、いま空のどこに見えるかは当日基準で求めます。
トポセントリック
地球の中心からではなく、地表の観測地点を原点として見た位置のことです。月のように近い天体では、地球中心から見た向きとの差が最大で約1度に達します。
南中
天体が観測地の子午線(真南と真北と天頂を通る線)を横切り、その日の最も高い位置に達することです。北半球では、このとき天体はたいてい真南に見えます。
薄明
太陽が地平線の下にありながら、空がまだ明るい時間帯です。太陽が沈むほど深くなり、夕方は高度−6度までの市民薄明、−12度までの航海薄明、−18度までの天文薄明の順に進みます。朝は逆に、天文薄明から航海薄明、市民薄明をたどって日の出に至ります。
秒角
角度の単位で、1度の3600分の1です。満月の見かけの直径がおよそ1800秒角にあたります。
秤動
月が地球に対して、わずかに首を振るように向きを変えて見える動きです。このおかげで、時間をかければ月面の約59%を地球から見ることができます。
分角
角度の単位で、1度の60分の1、すなわち60秒角です。
方位
観測者の地平線に沿って、真北を0度として東回りに測った角度です。東が90度、南が180度、西が270度にあたります。
ボートル・スケール
夜空がどれだけ暗いかを1から9の9段階で表す、天文愛好家のあいだで広く使われる尺度です。1は天の川が濃く見える最も暗い空、9は都心の空にあたります。

描画

AgX
明るさを画面の範囲へ写し取る曲線の1つで、明るい部分の色が白へ寄っていく過程をなだらかにします。以前から使われてきた曲線より、写真フィルムに近い階調になります。
discard
シェーダー(GPU上で走る小さなプログラム)の命令で、いま計算中の画素を書き込まずに捨てます。色を書かないだけでなく、画素ごとの距離を覚えておく領域にも何も残さないので、寄与のない画素を捨てても奥にあるものが隠れません。
EffectComposer
3D描画ライブラリthree.jsで、描いたあとの画面全体の処理を順につなぐための仕組みです。場面をまず画面ではなく一時的な画像へ描き、各処理を通したうえで最後に画面へ出します。
EXR
明るさを0から1に押し込めずに、実際の比のまま保存できる画像形式です。映画やCGの制作で標準的に使われ、正式にはOpenEXRといいます。
GLSL
WebGLのシェーダー(GPU上で走る小さなプログラム)を書くための言語で、C言語に似た文法とベクトル演算を備えています。
HDR
明るさを0から1の範囲に押し込めず、実際の比のまま扱う描画のやり方です。太陽と暗い星のように何桁も違う明るさを、1枚の絵の中で共存させられます。
KTX2
GPU(絵を描くための専用チップ)がそのまま扱える圧縮済みのテクスチャを収める、容器の形式です。機種ごとに違う圧縮方式へ変換できる形で入っているので、1つのファイルを配って各機種に合わせて取り出せます。
MSAA
MSAA(マルチサンプル・アンチエイリアス)は、1つの画素を複数の位置で描いて平均することで、輪郭のギザギザを目立たなくする手法です。手前か奥かを判定するための距離の値も同じ本数だけ持つので、その距離を覚えておく領域はサンプル数の分だけ大きくなります。
React Three Fiber
3D描画ライブラリthree.jsの場面を、Reactの部品として書けるようにするライブラリです。ReactがHTMLの要素ではなく3Dの物体を組み立て直します。
Rec.709
ハイビジョンのテレビ放送で定められた色の規格で、パソコンの画面で使うsRGBと同じ原色と白色点を共有しています。色の明るさを1つの数にまとめるときの重み、赤0.2126・緑0.7152・青0.0722もこの規格の値です。
renderOrder
3D描画ライブラリthree.jsで、シーンの中の描画順を明示的に指定する番号です。半透明なものは距離の比較だけでは正しく重ならないため、順序を人が決めます。
three.js
ブラウザで3Dを描くWebGLを扱いやすくする、定番のJavaScriptライブラリです。シーン、カメラ、形状、材質といった概念で場面を組み立て、描画命令の細部を引き受けてくれます。
uniform
シェーダー(GPU上で走る小さなプログラム)へ渡す値のうち、1回の描画のあいだ変わらないものです。現在時刻や太陽の方向のように、外から送る設定に使います。
WebGL
ブラウザの中からGPU(絵を描くための専用チップ)を直接使って3Dの絵を描く、Web標準の描画APIです。プラグインなしで、ページの中に立体的な場面を出せます。
z-fighting
前後がほぼ同じ距離にある2つの面について、どちらを手前に描くかの判定が画素ごと、あるいはフレームごとに入れ替わり、境目がちらついて見える現象です。原因は距離の差を表しきれないことで、深度(カメラから見た奥行き)の刻みが粗い場合にも、頂点の座標が大きくて丸め誤差が増える場合にも起きます。
アルファ
色に添えて持つ不透明度の値で、0が完全な透明、1が完全な不透明を意味します。
加算ブレンド
すでに画面にある色に新しい色を足し合わせる合成方法です。実際の光も重なれば明るくなるので、星の輝きや大気の散乱に向いています。
仮数部
浮動小数点数で、有効桁を持っている部分です。桁数が決まっているので、表せる刻み幅は値の大きさに比例して粗くなります。32ビットの形式では24ビットぶんの有効桁を持ちます。
画素
画面を細かく区切った1つ1つの点で、絵はその集まりでできています。色はこの単位で決まるので、描画の重さも塗るべき画素の数でおおよそ決まります。
基底
ある座標系の軸の向きを決める、たがいに直交する長さ1のベクトルの組です。この組を列に並べた行列を掛けると、その座標系での表し方に移せます。
球面線形補間
球面上の2点のあいだを、球を真っ二つにする平面が描く円に沿って、一定の速さでたどる補間です。向きや回転をなめらかにつなぐときの標準的なやり方です。
境界球
3Dの物体を丸ごと包む球で、中心と半径だけを持ちます。形の細部を見ずに済むので、画面の外かどうかの判定や、カメラからの距離の見積もりに使われます。
行列
数を縦横に並べた表で、3Dでは回転や移動といった座標の変換をひとまとめに表すのに使います。変換を続けて掛け合わせれば、いくつもの段階を1つの行列にまとめられます。
クアッド
四隅を持つ平らな面1枚のことで、三角形2つ分にあたります。絵を貼ったり、画面全体を覆ったりするのに使う、いちばん単純な形です。
グレア
非常に明るい光源のまわりに広がって見える、まぶしさのにじみです。目やレンズの中で光が散ることで生じ、光源そのものより大きく広がります。
参照テーブル
毎回計算し直す代わりに、あらかじめ計算した値を並べておいて引くための表です。GPU上では画像データの形で持ち、重い計算を1回の読み出しに置き換えます。
シェーダー
GPU(絵を描くための専用チップ)の上で走る小さなプログラムで、頂点をどこへ置くか、画素をどんな色にするかを計算します。1枚の絵を作るあいだに、頂点や画素の数だけ繰り返し実行されます。
深度
描画で、カメラからその画素に見えているものまでの距離のことです。どちらが手前かの判定は、この値を比べて行います。
深度テスト
新しい画素までの距離を、すでにそこに描かれているものまでの距離と比べ、奥にあるなら捨てるという判定です。これにより、描く順番によらず前後関係が正しくなります。3D描画ライブラリthree.jsの既定では、距離が等しい画素は通します。
深度バッファ
画素ごとに、いまそこに描かれているものまでの距離を覚えておくGPU上の記憶領域です。これがあるおかげで、手前のものが奥のものを隠せます。持っている値は距離そのものではなく、0から1に写した正規化された深度で、最も遠い状態が1.0です。
スプライト
GPU(絵を描くための専用チップ)が点1つを、指定した画素数の大きさの正方形として描く仕組みです。正方形の外側を捨てれば丸い星の像になるので、点として見える天体を大量に描くのに向いています。この記事には、星を描くこの点、three.jsでつねにカメラへ正対する画像付きの板(ラベルに使います)、多数の小さな画像を1枚にまとめたスプライトシート(ディープフィールドの銀河の画像)の三つの意味で出てきます。
正規化された深度
カメラからの距離を0から1の範囲に写し取った値で、深度バッファ(画素ごとの距離を覚えておくGPU上の記憶領域)が実際に持っている数です。手前の切り取り面が0、いちばん遠い状態が1.0にあたります。
線形RGB
色の値が光の量にそのまま比例する表し方です。画面へ渡すsRGBは人の目の感じ方に合わせて曲げてあるので、光を足したり掛けたりする計算は線形に直してから行い、最後に戻します。
単位ベクトル
長さを1にそろえた、向きだけを表すベクトルです。天体がどちらに見えるかのように、距離ではなく向きだけが要る量を扱うのに使います。
頂点シェーダー
形状の頂点1つ1つを画面上のどこへ置くかを計算する、GPU上の小さなプログラムです。頂点の数だけ実行されます。
直交行列
各軸が互いに直角で、長さが1にそろっている行列です。この形の行列は逆行列が転置、つまり縦横を入れ替えたものに等しく、逆向きの変換を計算なしで得られます。
点像分布関数
点である光源が、レンズや目を通したときにどれだけにじんだ像になるかを表す関数です。星が点ではなく小さなにじみとして見えるのは、この効果によります。
トーンマッピング
実際の比のまま持っている広い明るさの範囲を、画面が出せる狭い範囲へ写し取る処理です。どんな曲線で写すかが、色味と明るい部分の印象を決めます。
内積
2つのベクトルから1つの数を作る計算です。どちらも長さ1にそろえてあるときは向きの近さを表し、同じ向きで1、直角で0、正反対で−1になります。
ニアプレーン
カメラの手前側の切り取り面で、これより近いものは描かれません。近くに置くほど遠方の距離の精度が落ちるので、どこに置くかが遠くの前後関係の正しさを左右します。
描画範囲
用意してある頂点のうち、今回の描画でどこからどこまでを使うかを指す範囲です。データを作り直さずに、描く個数だけを増やしたり減らしたりできます。
ビルボード
カメラの方をいつも向くように回される、四角形1枚のメッシュです。大きさを自分で決められるので、GPUが点として描く方式より大きく広げられ、光のにじみのような広がりを表せます。
ファープレーン
カメラの奥側の切り取り面で、これより遠いものは描かれません。手前側の切り取り面との比が、遠くにあるものの前後を見分ける精度を決めるので、置く位置は必要な最遠距離ぎりぎりに選びます。
フラグメント
GPUが形を画素へ分解したときに生まれる、画素1つぶんの候補です。手前に何かあるかどうかの判定を通ったものだけが、最終的な色になります。
フラグメントシェーダー
画素1つ1つの色を決める、GPU上の小さなプログラムです。実行回数は形が画面で覆う面積に比例するので、大きく広がるものほど重くなります。
フレーム
動く絵を作るときの1コマです。滑らかに見せるには毎秒60コマ前後を描き続ける必要があり、1コマぶんの持ち時間は16ミリ秒ほどしかありません。
べき乗則
ある量が、距離などのべき乗に反比例して減っていく形のことです。指数関数のように急には消えず、遠くまで裾を引くのが特徴で、明るい光源のまわりのにじみがこの形をとります。
放射輝度
ある面から、ある向きへ出ていく光の強さを表す物理量です。カメラや目が受け取る明るさに直結するので、物理にもとづく描画はこの値を計算します。値に上限はなく、昼の空では、画面に出すときに使う0から1の範囲をはるかに超えます。
ポストエフェクト
場面を一度描いた画像に対して、あとから画面全体へ掛ける処理です。明るさを画面の出せる範囲へ写し取る処理や、色の調整がこの段で行われます。この記事では、空そのものもこの段で描かれます。
量子化
連続した値を、決まった刻み幅の目盛りに丸めて表すことです。刻みより細かい差は失われるので、もとは違っていた2つの値が同じになったり、前後の順序が入れ替わったりします。

Webと開発

Cloudflare Pages
静的なファイルを世界中の拠点から配信するホスティングサービスです。Gitのリポジトリを繋いでおくと、そこからビルドと公開が行われます。
fast-check
入力を自動生成して性質を確かめるテストのための、JavaScript向けライブラリです。
property-basedテスト
個別の入力と期待値を書き並べる代わりに、入力を自動生成して、どんな入力でも成り立つはずの性質を確かめるテストです。破れる入力が見つかると、最小の形まで縮めて示されます。
R2
Cloudflareのオブジェクトストレージで、テクスチャやバイナリのような大きなファイルを置く場所です。取り出しの通信料がかからない点が、同種のサービスと違います。
Zustand
Reactのための小さな状態管理ライブラリで、共有する状態を1か所に置く入れ物(ストア)を作ります。画面の各部分がそのうちどの値を使うかを申告しておくと、その値が変わったときだけ描き直されます。
圧縮ツール
公開用のJavaScriptから、変数名の長さや空白といった実行に不要な情報を削って小さくする道具です。名前は短い別名へ書き換えられるので、出来上がったコードに元の変数名は残りません。一方、文字列リテラル、つまり引用符で囲んだ文字列の中身は書き換えないので、そこに書いた語はそのまま残ります。
サーバーコンポーネント
Reactの部品のうち、ブラウザではなくビルド時またはサーバー側で描かれるものです。ビルド時に全ページを書き出す作り方では、ビルド中に一度だけ実行されます。
静的エクスポート
サイト全体をビルド時にHTMLとJavaScriptのファイルへ書き出し、リクエストのたびにサーバー側で組み立てないやり方です。配信は生成済みファイルを配るだけになります。
ティア
段階に分けたときの一段のことです。この記事では、星カタログを明るさで切り分けた各段を指し、明るい星だけを収めた段は、暗い星まで収めた段の先頭部分にそのまま含まれています。描画の重さをまとめて切り替える設定である品質段階とは、別の概念です。
フェイルクローズド
判断がつかないときは通さない、という設計の方針です。検査で言えば、何も描けていない真っ黒な画面でも通ってしまうような緩い判定を置かないことを指します。

Asterarium独自の用語

NUE
Asterariumの3Dシーンが使う、座標軸の取り方の名前です。観測者を原点に置いたうえで、X軸を真北、Y軸を天頂、Z軸を真東に向けます。名前はNorth・Up・Eastの頭文字です。
純粋な計算層
Asterariumで、three.jsもReactも状態管理の仕組みも参照しない、天文計算などのモジュール群を指す呼び名です。ブラウザを立ち上げずに実行できるので、入力を与えて戻り値を確かめるだけのテストが書けます。
上映モード
Asterariumで、操作用の表示をすべて隠して全画面に空だけを映す状態です。数秒操作しないと表示が消え、動かすとまた現れます。
天球グループ
Asterariumの3Dシーンで、天球を表しているthree.jsのGroup、つまり子オブジェクトをまとめて動かすための入れ物です。恒星・星座線・天の川・深宇宙天体の印などを子に持つので、この入れ物の姿勢を表す行列を書き換えると、子が全部いっしょに回ります。
独立3Dページ
Asterariumで、本編の空とも互いとも3Dシーンのコードを共有しない別ページ群のことで、全部で8つあります(月球儀、月面ウォーク、火星儀、ディープフィールド、オーラリー、恒星間フライト、日食と月食、投影機)。それぞれが専用のコードの塊として配られるので、開いたページの分しかダウンロードされません。
品質段階
Asterariumで、描画の重さをまとめて切り替える設定です。低いほうから低・中・高・最高(コード上はlow・medium・high・ultra)の4段があり、描く星は低が明るい順に6,000星まで、中が明るい側の8,037星、高と最高が全38,168星で、画面の解像度の上限と星のまたたきの有無も段ごとに変わります。実測のフレームレートに応じて自動で上下します。
星空ツアー
Asterariumで、場所・日時・カメラの向き・表示の設定をひとまとめに記録した場面をいくつも並べ、順に自動で見せていく再生機能です。1つの場面をステップと呼び、切り替え方と滞在時間をステップごとに決めます。
本編の空
この記事で、サイトのトップページを開いたときに出る夜空のシーンを指す呼び名です。地上に立つ観測者の視点から、星・星座線・天の川・太陽・月・惑星を大気散乱を通して描きます。8つの独立3Dページ(月球儀や投影機など、このシーンとも互いとも3Dのコードを共有しない別ページ)と区別するために使います。
間引き購読
Asterariumで、毎フレーム変わる値を画面側へは決まった回数だけ伝える仕組みです。購読とは値が変わるたびに知らせを受ける仕組みのことで、ここでは知らせを受け取る画面側が「毎秒2回」のように頻度を指定します。時計の表示は既定で毎秒2回しか読み直さないので、画面を作り直す処理がフレームごとには起きません。
夜係数
Asterariumで、空がどれだけ夜になっているかを0から1で表す値です。太陽の高度が0度のとき0、空が完全に暗くなる−18度で1になり、星・星座線・天の川・深宇宙天体の印の見え方をまとめて決めます。月は不透明な円盤のまま、その明るさをこの値を0.25から1の範囲に縮めた値で決めるので昼でも薄く見え、惑星は太陽高度についての別のしきい値で明るいうちから現れます。
ワールド座標
Asterariumの3Dシーンで物の位置を表す座標系で、1単位がおよそ1メートル、原点は観測者、軸の取り方はNUE(North-Up-East、北・上・東)です。ここでの距離は実際の距離ではなく描画のための便宜的な値で、星は半径1000(約1km)の球面に、太陽・月・惑星はその外側の200万(約2,000km)に置きます。描かれる大気の層の厚さは約6万単位(60km)です。