やり方
乗って見る
カメラを動く点 (衛星、惑星、自分で用意したもの) に乗せて、その点が回る天体を真下や地平線の向きで見ます。天体は半径で決まるので、どの天体でも使えます。
<wakusei-space> の space.ride(target, options) は、カメラを動く点の、いま表示している時刻の本当の位置に置いて、その点が回る天体のほうを向けます。カメラの向きだけを求める計算は @johnmorrisdotca/wakusei-planets/space の ridePose で、ページやテストからも同じ問いができます。
import "@johnmorrisdotca/wakusei-planets/space/element";
const space = document.querySelector("wakusei-space")!;
space.ride("moon", { look: "horizon" });
space.ride("io");
space.ride({ at: (ms) => ({ position: [6778, 0, 0], velocity: [0, 7.66, 0] }) }, { around: "earth" });
space.ride(null);乗れるもの
- ビューの天体 (
"moon"、"sun"、"mars"など): 地球のまわりを回るものとして扱います。カメラはその天体の、ビューの縮尺での位置にあり、地球を向きます。 - 衛星 (
"io"、"titan"、"phobos"など): 親の惑星のまわりを回ります。カメラは、惑星から見た衛星の本当の位置 (惑星の半径を単位に) にあり、惑星を向きます。 - 自分で用意した点:
{ at(ms) }が、回る天体の中心からの{ position, velocity }を、キロメートルとキロメートル毎秒、J2000 赤道座標 (x が春分点の向き、y が北) で返します。その時刻に位置が分からなければnullを返します。回る天体はaroundで指定します (初期値は地球)。この要素は、点が何なのかを知りません。自分の SGP4 の衛星でも、自分の表の探査機でもかまいません。
look は down (天体の中心を真っすぐ見る。地面がカメラの下を流れる) か horizon (進む向きへ傾けて、地平線が真ん中より少し上に来るまで) です。進む向きは、点の速度から天体へ向かう成分を引いたものです。衛星では、1秒ずれた2つの位置から求めます。view: "follow" にすると、カメラは対象から一定の距離を保って、対象のほうを見ます (自分で用意した点では distanceKm、天体と衛星ではズームで決まる距離)。
カメラ
import { ridePose } from "@johnmorrisdotca/wakusei-planets/space";
const pose = ridePose({ position: [5.9, 0, 0], velocity: [0, 1, 0], radius: 1, look: "down", yaw: 0, tilt: 0, zoom: 1 });
console.log(pose.forward.map((n) => n.toFixed(2)).join(","), pose.bodyRadiusDegrees.toFixed(1));-1.00,0.00,0.00 9.8position と velocity は、天体の中心からの、好きな単位の値です。radius は同じ単位での天体の半径です。木星の半径を単位にして radius: 1 としても、キロメートルで radius: 69911 としても、同じカメラになります。結果は、カメラの位置、見る向きと上の向き (単位ベクトル)、視野角 (ズーム1で60度、ズームで狭くなる)、そこから見た天体の見かけの半径です。
ドラッグすると、首を振るようにその場で見回します。右へドラッグするとカメラは左を向き、上へドラッグすると絵の下のほうへ傾くので、地面はポインターについてきます。ドラッグ1ピクセルにつき約1.5ピクセル動き、ズームしても変わりません。
切り替えと止め方
もう一度 ride を呼ぶと、古いカメラから新しいカメラへ1秒ちょっとかけてなめらかに移ります (smooth: false や、動きを減らす設定の人には、すぐ切り替わります)。ride(null) で止めると、カメラは乗る前に見ていた天体に戻ります。乗っている天体と、その点が回る天体の名前は、乗っている間は表示しません。位置が分からない点では、wakusei-ride-lost が1度だけ発火して、ふつうのカメラを使います。space.riding で何に乗っているか、stats.ride で riding、lost、gliding が分かります。
いつ描くか
ビューは、何かが変わったときだけ、1秒に30回までしか描きません。乗っている間は絵がずっと動くので、1ピクセル動くたびに描きます (カメラの下の地面の速さを高さで割り、画面上の焦点距離をかけ、時計の速さをかけたもの)。1秒に1回から30回です。止めている間は何も描きません。画面の外でも描きません。動きを減らす設定では、1秒に1回の更新で、なめらかな移動もしません。それぞれを pnpm test:freeze と e2e/space.demo.ts で確かめています。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。