当前位置: 首页 > 知识库问答 >
问题:

有没有可能在大小和质量的物质上进行逼真的N体太阳系模拟?

胥宏义
2023-03-14
Velocity += Acceleration * Time.deltaTime;
position += Velocity * Time.deltaTime;

现在,当我把速度*timedelta(在这一点上,大概是10,000,000,000,000,000,000,000)加到23500的位置时,它基本上不会加。位置仍然是(0,0,23500)而不是类似于(0,0,

如果我将地球的初始位置设置为0,0,0并且仍然,将加速度设置为0.0000000000000000000000009以确保它的位置是(0,0,23500),然后“加”速度*TimeDelta。它变成类似于(0,000000000000000000000000000000000000000000000000000005)的东西,并且不断增加。当浮点为0时,加这么小的值是没有问题的。但如果浮点数是23500,那么它就不会把小值加起来。

我不知道这到底是Unity的问题还是C#的浮点问题。

这就是为什么我不能让它在小数值下工作。如果我能克服这一点,我的问题就解决了。

//////////////////////////////////////////////////////////////////////////////////

我一直在开发N体物理学来模拟我们的太阳系,所以我一直在收集数据,使它尽可能的逼真。但是数据大小有一个问题。我搜索了每一个微小的互联网,我没有找到一个单一的解释,人们是如何克服这一点。(如果他们是这样的话)所以我在这里尝试一下。

所以,为了保持行星之间的距离、半径和“质量”的比率不变,我创建了一个excel文件来计算所有的数据。(因为为什么有人会把“地球的质量会是多少”这个“半径图”放到互联网上呢?)我会把党卫军作为附件。它基本地将行星的每一个属性“标准化”或换句话说“缩放”到一个给定的参考。在这种情况下,我以“地球半径”作为参考。

我在团结中工作,而你知道,你不能在团结中用“太大”或“太小”的价值观工作。所以我不得不把太阳系缩小,“缩小了很多!”

所以我用牛顿的万有引力定律,即F=gmm/r^2,使它变得简单,我直接计算一个给定物体的a=gm/r^2,来自其他物体。

所以问题是,当我把地球的半径取为1时,对太阳的引力加速量就会变得像是,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万,万当然Unity不适合这种价值。

所以,如果我增加地球的半径,那么太阳的质量和半径就会变得非常大,然后,我就不能用它来工作了。

我不知道其他人是如何解决这个问题的,他们做了什么来克服这个问题,但从这里我看到,要做太阳系的真实的N体模拟看起来是不可能的。(至少在unity中)

所以我需要有10个代表张贴图像-_-,我会给链接代替。http://berkaydursun.com/solar_system_simulator/data.png还有一个目录是工作中的实验太阳系模拟,使用N体计算,但数值不现实。它工作得很好,甚至看起来有点接近真实值,但不,它没有正确的比率^^如果您愿意,可以在这里测试它http://berkaydursun.com/solar_system_simulator/

编辑:哇,我几乎每一段都是以“所以”开头的^^

共有1个答案

梁豪
2023-03-14

正如你所看到的,它在任何高度或变焦都很好,大气是这样做的,就像这个大气散射着色器

模拟仿真

我不使用N体重力模拟,因为你需要大量的数据,这是非常非常难得到的(几乎不可能达到期望的精度)。计算必须非常精确。

    null

一般情况下,开普勒方程的误差较大,但并不是随时间增加太多。重力模型更精确,但它的误差随着时间的推移而上升,你需要不断更新天体数据来使它工作。

[edit1]积分精度

您当前的实现是这样的:

// object variables
double  acc[3],vel[3],pos[3];
// timer iteration
double dt=timer.interval;
for (int i=0;i<3;i++)
 {
 vel[i]+=acc[i]*dt;
 pos[i]+=vel[i]*dt;
 }
// object variables
double          vel0[3],pos0[3]; // low
double          vel1[3],pos1[3]; // high
double  acc [3],vel [3],pos [3]; // full
// timer iteration
double dt =timer.interval;
double max=10.0; // precision range constant
for (int i=0;i<3;i++)
 {
 vel0[i]+=acc[i]*dt; if (fabs(vel0[i]>=max)) { vel1[i]+=vel0[i]; vel0[i]=0.0; } vel[i]=vel0[i]+vel1[i];
 pos0[i]+=vel[i]*dt; if (fabs(pos0[i]>=max)) { pos1[i]+=pos0[i]; pos0[i]=0.0; } pos[i]=pos0[i]+pos1[i];
 }
    null
  • 如何使用两个浮点模拟双精度

[编辑2]星星

  • 星星的颜色是我见过的最好的星星图像
  • 恒星B-V颜色索引视RGB颜色所有恒星星表使用B-V索引
  • 使用星表目录也有星表名称交叉引用链接
  • Skybox:合并不同的恒星数据
G = 6.67384e-11;
v = sqrt(G*M/a);                           // orbital speed
T = sqrt((4.0*M_PI*M_PI*a*a*a)/(G*(m+M))); // orbital period
dt = 0.000001*T

因此,要将新身体放入测试中,只需将其放入:

pos = (a,0,0)
vel = (0,sqrt(G*M/a),0)

而主焦体(太阳)位于:

pos = (0,0,0)
vel = (0,0,0)

这将把你的身体放在圆形轨道上,这样你就可以比较开普勒和牛顿达朗贝尔来评估你模拟的精度。

 类似资料:
  • 模型的材质可以有两种定义方式,一种是在代码中导入模型后设置材质,另一种是在建模软件中导出材质信息。下面,我们将分别介绍这两种方法。 代码中设置材质 这种方法与例7.2.1类似,不同之处在于回调函数中设置模型的材质: 例7.3.1 var loader = new THREE.OBJLoader(); loader.load('../lib/port.obj', function(obj) {

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我有一个开源应用程序,可以将照片上传到Facebook。为了节省带宽,照片在上传之前会自动调整大小(Facebook设置了最大大小限制)。少数人抱怨照片质量,实际上您可以看到其中的区别(有关某些演示图像,请参阅此问题)。 所以我的问题

  • 我正在处理一个课堂问题,要求我在3D空间中模拟太阳系内行星/卫星/小行星的运动。学期初我们从矢量、质量和力开始,所以我仍在努力掌握它。 *我的问题在第4步和第5步中有详细说明。如果我一路上有什么错误,请告诉我。任何意见和指导将不胜感激。 提供的信息 空间中的每个物体都具有以下特征: 质量 位置向量 我必须使用牛顿万有引力定律: 问题 给定时间t,更新空间中每个物体的位置和速度。那么,如果t是10秒

  • 我想从二值图像中得到圆形状的质心,但输出给出了不止一个质心。我使用的是opencv web教程文档中关于图像时刻和修改的代码。供参考,我使用的是C++API OpenCV。 输出结果是: 我预计,文本输出可能会从3个轮廓中给出3个质心,但实际上是7个轮廓(轮廓[0],...,轮廓[6])。

  • 本文向大家介绍Java数组中最大质数和最小质数之间的差异,包括了Java数组中最大质数和最小质数之间的差异的使用技巧和注意事项,需要的朋友参考一下 问题陈述 对于给定的整数数组,其中所有元素均小于1000000。找到数组中最大素数和最小素数之间的差。 示例 解 使用Eratosthenes筛分法,这是找出小于给定数的所有素数的有效方法。然后,我们将找出最大和最小的质数以获得所需的差。 示例 以下是

  • 我正在尝试发送并显示图像文件。我可以显示和编码/解码大约50kb(低于50kb)的图像。但当我尝试发送/编码大于100kb的图像时,我得到了一个错误:。 我使用这些代码获取文件路径 我将位图转换为字节数组,将字节数组转换为base64string。我用socketio将basese64string发送到服务器。我在ImageView中显示位图。但当文件大于50kb时,base64编码和imagev