天球(スカイドーム / Skydome)は、立方体ではなく半球や球体の3Dモデル(メッシュ)にテクスチャを貼り付ける方式です。
天球の数式は、視線ベクトル (x, y, z) を極座標(緯度・経度)に変換して、2DテクスチャのUV座標 (u, v) を求める数式が基本となります。
1. 視線ベクトルからUV座標への変換式
原点から天球の表面に向かう、長さが 1 に正規化された視線ベクトルを $\mathbf{V} = (x, y, z)$ とします。(※Y軸が上方向の座標系を想定)
このとき、2Dテクスチャ(パノラマ画像など)を綺麗に巻き付けるためのUV座標は、逆三角関数を用いて以下の数式で計算します。
•U座標(経度・水平方向の回転)
$$u = \frac{\operatorname{atan2}(z, x)}{2\pi} 0.5$$
◦$\operatorname{atan2}(z, x)$ は -π から π の範囲の角度を返します。
◦これを 2π で割り、 0.5 することで、範囲を 0.0 ~ 1.0 に収めます。
•
•V座標(緯度・垂直方向の高さ)
$$v = \frac{\operatorname{asin}(y)}{\pi} 0.5$$
◦$\operatorname{asin}(y)$ は $-\frac{\pi}{2}$ から $\frac{\pi}{2}$ の範囲(真下から真上)の角度を返します。
◦これを π で割り、 0.5 することで、範囲を 0.0 ~ 1.0 に収めます。
•
2. スカイボックス(立方体)との決定的な違い
•スカイボックス:3D空間の視線ベクトル (x, y, z) をそのままテクスチャのサンプリング座標として使います(キューブマップ)。
•天球(スカイドーム):3Dの向きを一度2Dの緯度・経度(UV面)に変換してから、1枚の平らなパノラマ画像をサンプリングします(緯度経度マップ / Equirectangular)。
3. 天球特有の数式(ドームの歪み補正)
天球に普通の2Dテクスチャを上からそのまま投影(投影マッピング)すると、天頂(真上)付近でテクスチャが引き伸ばされて中心に集まる「極点の歪み(ピンチ・アーティファクト)」が発生します。
これを防ぐため、シェーダー内では頂点座標の水平距離 R を計算し、歪みを補正する数式が使われます。
•頂点 (x, y, z) の水平半径:
$R = \sqrt{x^2 z^2}$
•この R の比率に応じてテクスチャのUVを縮小・拡大することで、真上を見上げたときも綺麗な雲や星空を描写できます。
天球の数式や実装について、さらに詳しく知りたい部分はありますか?
もしよろしければ、以下の点を教えていただければ、目的に合った具体的な数式やコードを提示できます。
•使用しているゲームエンジンやツール(Unity、Unreal Engine、Three.js、GLSLなど)
•実装したい表現(自作のパノラマ画像を綺麗に貼りたい、時間経過で太陽を動かしたい、など)
ふーん🤔