私はJavaとJava3Dを使用して、「飛ぶ」ことができる天の川銀河の比較的単純なモデルを構築しています。
これまでのところ、40,000個の既知の星を読み取り、それらをSphereオブジェクトとして(キーボード+マウスナビゲーションを使用して)表示する単純なバージョンが機能しています。ただし、それ以上の進歩を妨げるいくつかの問題があります。
私が苦労している問題の1つは、星の明るさの絶対等級(対数目盛)と観測者からの現在の距離の関数である見かけの等級に従って星をレンダリングする必要があることです。見かけの等級が非常に小さい星(地球軌道から見たプロキシマケンタウリなど)は見えないはずですが、非常に明るい星(デネブなど)は地球から比較的離れた場所でも見えるはずです。
そのため、固定された「実際の」サイズと現在の観測場所からの距離に基づいて星を表示することはできません。これにより、非常に薄暗い近くの星でも巨大なブロブが発生しますが、デネブのようなめちゃくちゃ明るい星は、距離が離れているためにまったく表示されません。
問題は、Java3dオブジェクトを動的に割り当てたり削除したりせずに、現在の視点位置からの距離に応じて変化する見かけの等級に基づいて星の画像をどのように表現できるかということです。または、レンダリングの開始後にJava3Dでオブジェクトを変更する必要がある場合、フレームレートを下げずにそれを行うにはどうすればよいですか?
透明度を使ってみました。巨大な円が少し見づらくなるだけです。霧を使ってみましたが、遠くの星(と星座の線)が完全に曇っています。球をShape3Dオブジェクトに変換しようとしましたが、ヒープスペースの2倍を消費します。
幸せな特殊なケースの1つは、見かけの等級が7.00より大きい星を表示する必要がないことです。これは、人間の目では星を見ることができないためです。理論的には、空間内の現在の位置に基づいて表示できるものについては、3Dオブジェクトを生成するだけで済みます。これにより、データベース内のすべてのスターに対してSphereオブジェクトを作成するよりもパフォーマンスが向上するだけでなく、Javaヒープスペースの不足を回避するのに役立ちます。(含めたい実際の星は100,000を超えていますが、40,000を超えるとヒープスペースが不足し、試したJava設定ではヒープスペースが増えません。)
このような星の明るさの動的な表示が可能であることを私は知っています。注目に値するSpaceEngineシミュレーションプログラムの作成者がそれを実行します(そして、1秒あたり60フレームを取得することができます)。彼がどうやってそれをしているのか、私は一生理解できません。
素朴な実装の限界に達し、許容できるパフォーマンスと機能を実現する唯一の方法は、ディスプレイの概念全体を再設計することだと完全に期待しています。Java3Dを使用して動的オブジェクトの可視化を行う方法について、いくつかの具体的な回答を確認したいと思いますが、この時点で、専門家の推測に落ち着きます。(私はJava3Dを放棄したくないのですが、そこでも特定の推奨事項を受け入れています。)