ダブル(またはロング)を使用して、太陽系を3D空間で正確に表現できますか?


15

太陽系全体を現実的にモデル化することを目的とする3Dゲームで座標を最適に管理する方法を知りたいと思います。フレームの許容可能な動き)。64ビットのdouble(または64ビットのlong)はこれをサポートしますか、それともオーバーフローの問題に遭遇しますか?そうでない場合、longsまたはdoublesを使用する必要がありますか、または使用する場合、3Dゲームで太陽系の位置をモデル化するのに最も適切な代替方法はどれだと思いますか?(つまり、船までの距離に基づいて一度にディスプレイにシステムのビットを保持するか、システムを別の座標空間などで何らかの形で表示させるなど)


どの言語をターゲットにしていますか:C / C ++?Java?他に何か?
ローランクーヴィドゥー

4
@lorancou:無関係、彼は明示的にのサイズを指定しましたlong
DeadMG

@DeadMG C / C ++で32ビットにすることができます。64ビットはより多くのlong long。しかし、ええ、あなたが望むなら、それをnitpickingと呼びます。
ローランクーヴィドゥ

BigIntegerを使用するだけです。ほとんどの言語には、いくつかのバリエーションがあります-サイズに制限のない整数値(使用量はO(log(n))です)
-ashes999

ゲームがコンピューティングにあまり重くないのであれば、それは答えかもしれません。
ローランクーヴィドゥ

回答:


11

整数についてはすでに良い答えがありますが、浮動小数点を排除すべきではないと感じています。彼の答えでは、Byte56はおそらくthis王星の最大軌道に行くオプションを取りました。おそらくこのエクセルシートから取られたので、私はそれに固執します。

これにより、太陽系の境界は次のようになります。

7,376,000,000 km = 7.376x10 ^ 9 km = 7.376x10 ^ 14 cm≈ cm≈7.4x10 ^ 14 cm

倍精度浮動小数点フォーマットは 15の重要小数の最大精度を提供します。幸運なことに、原点が太陽の中心にあり、Pl王星の周りの位置を使用している場合、すべてのセンチメートルを表すことができます。たとえば、C ++の場合:

printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);

Output:
-------
740000000000000
740000000000001
740000000000002

あなたのゲームをPl王星の軌道に制限できるなら、おめでとうございます!それを表すのに倍精度で十分な精度があります。

ただし、シミュレーションでそれを表すのに十分であることに注意してください。しかし、これを簡単レンダリング。32ビットの浮動小数点数に変換する必要があります。おそらく、原点を変更して、近いオブジェクトに十分な精度を得る必要があります。また、Zバッファーとカメラの錐台のトリックを使用して、これらすべてを適切にレンダリングする必要があります。

さて、宇宙飛行士にオールトクラウド内の遠く離れた彗星を訪れてもらいたいなら、それはもっと大きいです、それで終わりです。約10 ^ 16 cmで、精度が失われ始めます。

printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);

Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002

もちろん、さらに悪化します。

そのため、この場合は、さらに高度なソリューションを試してみてください。ゲームプログラミングジェム 4 のPeter Freezeの記事「2.3大きな世界座標での精度の問題の解決」をご覧になることをお勧めします。IIRC、彼はあなたのニーズに合ったシステムを提案します、それは確かにある種の複数の異なる座標空間です。

これはいくつかのヒントにすぎません。おそらく、これを実行するには、自分のレシピを使用する必要があります。そのようなものを既に実装している誰かがあなたをもっと助けるかもしれません。たとえば、Kerbal Space Programの背後にいる人にメールを送信してみませんか?

あなたのゲームで頑張ってください!


1
この答えは、OpenGLやDirectXなどで使用される3D浮動小数点空間により簡単にマッピングされ、優れたリファレンスがあるため、良いです。したがって、私はそれを答えとしてマークしました:)
ニコラスヒル

クール:)おまけに、これはすべて非常に近似であるため、Bruce Dawsonのブログ(randomascii.wordpress.com/2012/05/20/…)で、フロートに関する詳細な情報を見つけることができます。
ローランクーヴィドゥー

17

uto王星が太陽系の「端」であると仮定します(ただし、3光年も離れていると言う人もいます)。Pl王星は、最大軌道で太陽から約7,376,000,000キロメートルです。7.37600×10 ^ 14センチメートルです。それを倍にして直径を取得すると、1,475,200,000,000,000センチメートルになります。これは、64ビット長の最大サイズの範囲内です。太陽系の高さは直径に比べて無視できるため、無視できます。

そう、あなたは太陽系でのあなたの位置を表すために長いを使用することができます。実際には、符号付きロング(符号なしの場合はダブル)で9.75光年までのポジションを出すことができます。

これは距離を見つける場合には当てはまらないことに注意してください。見つけることができる最大距離は、移動できる最大距離の平方根です。これは、距離を見つけるために詳細レベルのシステムを使用することで克服できます。いくつかの簡単なチェックを行って、距離がどれだけ離れているかを推測し(x値とy値を比較)、大きな距離では1,000,000キロメートルの増分を使用し、小さな距離ではセンチメートルの増分まで使用できます。

もちろん、本当にしたいのかという疑問がありますか?太陽系の99.999%はまったく興味のない空きスペースです。太陽系を正確に表しているのであれば、物理学を正確に表していないことを願っています。太陽系を回避するには長い時間がかかります。ほとんどの人が興味を持ち続けるには長すぎます。

そして、その精度で太陽系のオブジェクトもモデル化するのでなければ、なぜそんなに高い精度さえ持っているのでしょうか?それはあなたがトラブルに巻き込まれる場所です。太陽の体積は1.40900×10 ^ 18立方キロメートルです。立方センチメートルのスケールでは、そのスペースが「占有されている」ことを表すために単一のビットを使用すると、1.4×10 ^ 33ビットまたは1.6×10 ^ 23ギガバイトを占有します。あなたはそれほど多くのRAMを持っていないと思います。


3
かなりのスポット。ショートバージョン:フロート精度はあなたの心配の最小です。
aaaaaaaaaaaa

1
あなたはしますも、64ビット整数、とオーバーフローを得ます。Space王星の周りの宇宙船の軌道。宇宙船から太陽までの距離の計算を試みます。二乗。ブーム。
ローランクーヴィドゥー

3
私は最後の段落の主張に強く反対します-OPの質問は現状のままで完全に理にかなっており、位置の1cmの精度を気にするために実際にすべての(立方)センチメートルにアイテムがあることを期待する必要はありません。
スティーブンスタドニッキー

1
@StevenStadnickiまあまあですが、キロメートルスケールでも、1立方キロメートルあたり1ビットで164,029,188ギガバイトです。これは、車の速度計で原子精度を要求することに似ています。それは必要以上に正確な方法です。
マイケルハウス

1
さて、AUまたは光年スケールに移行するのは不正確すぎます。私たちは太陽系について話しているので。大きな星雲のような大きなものには、光年またはパーセックが適しています。
マイケルハウス

2

BigIntegerプログラミング言語で呼ばれているものは何でも使用できます。無制限のサイズの整数です。それはうまくスケーリングします-一般log(n)にサイズの整数のストレージを使用しますn

JavaとC#にはそれがあります。他の言語もそうだと思います。そうでない場合は、苦労せずに逆コンパイルして再実装できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.