「もしも、あの衛星計画が実現したら未来の宇宙はどうなる?」という誰もが抱く好奇心を、インタラクティブなシミュレーションで解き明かすのが『もしもオービット』の面白さです。専門家向けの難解なデータ解析ツールとは異なり、テキスト入力だけで未来の軌道混雑をアニメーションで視覚化することで、宇宙ゴミという公共課題を誰もが「自分ごと」として考えられるようにします。この体験は、複雑な物理モデルをAIで軽量化し、教育的な対話ツールへと昇華させる最新のトレンドを反映した試みです。
もしもオービット
企業の衛星計画が10年後の宇宙ゴミをアニメーションで予測
ユーザーがテキストエリアに打ち上げ計画を入力し、「予測」ボタンをクリックするだけで、10年後の宇宙ゴミによる軌道混雑の変化をシミュレーションします。結果はアニメーションで分かりやすく表示されます。
今後は、今は固定シナリオの再生だけですが、次は軌道力学の簡易モデルを実際に組み込み、ユーザーが入力した複数の計画をリアルタイムに比較・検討できるようにしたいです。将来的には教育機関向けの教材として、宇宙開発の持続可能性を議論する際の定番ツールになることを目指しています。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
企業の衛星打ち上げ計画を入力
ユーザーはテキスト形式で衛星打ち上げ計画を入力します。例えば、「SpaceXがStarlinkのような通信衛星を新たに1000機、高度550kmの低軌道に投入する計画」のような具体的な内容を記述します。
計画テキストから構造化データを抽出
入力された計画テキストから、AIが以下の項目をJSON形式で抽出する設計です。企業名、衛星の数、軌道高度を特定します。例: { "company": "SpaceX", "satellites": 1000, "altitudeKm": 550 }
軌道混雑シミュレーションを実行
抽出された構造化データに基づき、10年後の軌道混雑への影響をシミュレートする設計です。このデモは、事前に用意された静的なサンプルデータに基づいて結果が生成されます。
シミュレーション結果の要約を表示
シミュレーション結果として、軌道衝突リスクの増加率や軌道混雑の状況を説明するサマリーテキストが表示されます。例: 「この計画により、10年後には軌道衝突リスクが25%増加し、特に低軌道の混雑が顕著になります。」
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
衛星計画から軌道混雑を予測するこのシミュレーションは、単一の未来像を示す点で教育的価値が高い。この仕組みを、複数の異なる計画案を並列で比較し、その影響の差分を可視化する用途に転用できれば、政策立案や投資判断における比較検討ツールとして、その適用範囲を広げられるだろう。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
'use client';
import { useState, useEffect } from 'react';
import { sampleTrace } from '../data/sample-trace';
// NOTE: Types are re-declared here to avoid importing from `source/core`.
// This is a requirement for static trace-replay demos.
interface SimulationOutput {
summary: string;
collisionRiskIncrease: number;
}
const containerStyle: React.CSSProperties = {
fontFamily: 'sans-serif',
maxWidth: '800px',
margin: '0 auto',
padding: '2rem',
backgroundColor: '#f5f5f5',
color: '#333'
};
const headerStyle: React.CSSProperties = {
borderBottom: '1px solid #ddd',
paddingBottom: '1rem',
marginBottom: '1rem',
textAlign: 'center'
};
const mainStyle: React.CSSProperties = {
display: 'grid',
gridTemplateColumns: '1fr 1fr',
gap: '2rem',
alignItems: 'start',
backgroundColor: '#fff',
padding: '1.5rem',
borderRadius: '12px',
boxShadow: '0 4px 12px rgba(0,0,0,0.08)'
};
const controlsStyle: React.CSSProperties = {
display: 'flex',
flexDirection: 'column',
gap: '1rem'
};
const resultsStyle: React.CSSProperties = {
border: '1px solid #e0e0e0',
borderRadius: '8px',
padding: '1.5rem',
backgroundColor: '#fefefe',
minHeight: '200px'
};
const DynamicOrbitView = ({ isRunning, collisionRiskIncrease }: { isRunning: boolean, collisionRiskIncrease: number }) => {
const [numDots, setNumDots] = useState(50); // Initial dots
const [dotColor, setDotColor] = useState('white');
const [showRedEffect, setShowRedEffect] = useState(false);
useEffect(() => {
let animationInterval: NodeJS.Timeout;
if (isRunning) {
setDotColo
...