欢迎光临散文网 会员登陆 & 注册

“冒充伟大的先知”:三体世界太阳运行规律【万年历】(含行星自转视角、飞星—太阳变

2023-07-10 16:06 作者:月环石  | 我要投稿

【原创】自转行星视角的“三体世界万年历”MATLAB代码编写思路


这本质上是一个包含四个质点运动状态的物理模型。我写的代码还比较繁复杂乱,因此这里只列出关键思路和重点代码。Bilibili月环石撰文,本篇请勿随意转载!

按照刘慈欣科幻小说《三体》的描述,“三体世界”目前包含3颗互相绕转的恒星(原型为半人马座三合星)以及1颗行星。由于行星质量极小,因此不考虑其对恒星的影响以节省运算。

注:以下代码中使用的任何参数都只是某次测试中的临时设定值,仅供参考。视频中的参数具体是多少已经记不清了。


  • 知识基础

大约初高中的数学和物理知识点,加上MATLAB基本操作的学习。

为了求解三维空间的恒星三体运动,以及行星受恒星影响产生的运动,需了解:牛顿力学三定律、万有引力公式、矢量合成与分解、微分和差分思想。

为了表现行星自转,绘制地面观测点的实时星图,需了解:平面直角坐标系旋转变换、球坐标转换。

为了真实性,物理常量和行星恒星数据尽量接近我们的宇宙。引力常数等均使用真实值。

(某次设定,仅供参考。半径仅用于判断“碰撞”,其他时候星球视为质点)


  • 三体运动+行星运动的计算和呈现

需要设好四颗星球在三个维度初始的运动速度和坐标矢量(可以自己随便试,也可以先大致计算一下,想要长期维持需要提供一定的切向速度)。这一部分在网上有很多代码提供。

核心在于用万有引力公式算作用力和加速度:

恒星和行星之间,仅单向考虑恒星对行星的作用。

然后从三个维度方向矢量分解,分别计算各方向运动状态。

这么个数值模拟程序做不到微分,所以就使用差分方法,把连续的曲线运动简化成一段段匀变速直线运动,把不断变化的作用力视为在小段时间内不变。逐个描点作图即得轨迹。

时间划分越短就越精确,但也更耗时。为了保证精度的同时加快绘图效率,设定每计算20个点绘制一次行星,恒星由于运动相对更慢,绘制频率可以更低。


  • 行星地面视角星图

以下部分应该是首创内容。

行星自转时恒星坐标变换:设行星沿z轴方向自西向东恒定自转(简化,不考虑恒星对自转速度的影响),相对的,也就是从地面仰视整个宇宙自东向西转动。于是把赤道上某点(纬度度不为0时计算更复杂,但画面也更有趣)地面视为原z轴新x轴组成,垂直于地面的是新y轴。按照坐标轴的恒速旋转,只需把恒星在x、y轴方向相对坐标映射到新轴。新y轴方向大于0的,就是地平线上可见的恒星。

上图中已换算成球坐标,即可直接绘图。

地面视角坐标图:含恒星的坐标点以及运动轨迹。

昼夜背景:根据是否有至少一个太阳出现在地平线以上,用RGB码给背景上蓝色(0.2,0.3,0.6)或黑色(0,0,0),飞星不算太阳。与某一太阳过近时,绘制红色(0.8,0.3,0.3)表示烈焰危机。

飞星、太阳的大小变化:近大远小,夸张处理。用markersize参数改变点的大小,对于在地平线以上的:恒星处于“太阳”状态的距离d_star内时,令大小与距离服从一定函数关系;当距离大于d_star时,突变为“飞星”,大小突然缩小为1。


  • 其他游戏设定

一些参数:

(关于撕裂的设定似乎比较矛盾,没用上)

文明状态播报:参考《三体》小说情节,个人编写下表进行判定,依据离行星不同距离上存在的恒星个数划分情况:

判断语句的部分代码(并不完善):

文明的毁灭(极端环境超过20个时间单位才触发):

游戏结局判定(三体人的彻底灭亡,除非入侵地球):根据行星与三颗恒星的距离判断游戏结束,退出循环。吞噬考虑了碰撞半径。

结局效果如下(某次开场即灭亡)

隐藏结局(如果不是故意的,极少遇到):



“冒充伟大的先知”:三体世界太阳运行规律【万年历】(含行星自转视角、飞星—太阳变的评论 (共 条)

分享到微博请遵守国家法律