haoxiaobo

从C到C++又到.net, 有一些心得, 和大家交流下...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

利用简单的力学法则来模拟天体运行(2)

Posted on 2013-10-16 14:37  HAL9000  阅读(2137)  评论(3编辑  收藏  举报

Hi,我对于之前的天体运行程序 (原贴http://www.cnblogs.com/haoxiaobo/p/3368320.html)又做了一次改进,如下:

 

* 增加运动计算的精确度!

运动计算加入了上次说的线性取中值(其实就是除于2啦),果然又精确了一点。

* 加入相对论修正!

在测试中发现有时星体被加速到超光速!发现自己忘记相对论效应啦!这次加入相对论修正。

* 增加星体合并!

当两个星距离小于半径之和时,大星吃掉小星,质量、半径、颜色、动量发生合并。

* 星体支持贴图!

可以构造方法里指定正方形的星星图,此图会被做为星星的显示材质。如果不指定,就用指定的颜色画一个。

下面的图就是部分效果:

 

* 用真实的比例显示星体大小!

按真实的星体大小来显示。这个修改之后,虽然更科学了,但也发现可视性效果差了很多,比如放大到太阳占到整个屏幕大小了,地球还只是一个点点……,要想看到远行星,更是需要拖呀拖呀拖呀拖呀……滚呀滚呀滚呀……

宇宙中的尺度真是太大太大太大了,比例真是太大太大太大了……,没办法,于是我又发明了几个功能:小于4个像素的,就画4个像素质。以及,下面的这些个功能:

* 用Shift+滚轮可以单独缩放星体大小!

这样,就可以在空间比例不变的情况下,缩放星星的大小,可以把星星放大到可以在屏幕上看到。

下图就是把所有星体放大5000倍的样子。

* 空格键可以缩放当前跟随的星体到合适的大小来观看!

在跟随某星观察时,可以按下空格键,立即把空间比例缩放到一个合适显示这个星星的大小,并定在屏幕正中。

谁能找出为什么有些星星会在一些大比例显示时会轻微地晃动?

* 鼠标点击选择相机跟随!

原来用C键切换相机跟随星体。星星多了就不方便了。现在用鼠标在屏幕上直接点选星星进行跟随。

同时,也把标签(L)、轨迹(O)、速度(V)等设为默认不显示。当跟随时,或是鼠标在星星上晃时才显示。提高了重绘效率了。

 

--------------------------------------------------------------------------------

以下是还可以加入的功能。不过近期不会再做了。

 

* 引力潮

现在的程序里是把星体做为质点来计算的,星体的大小只用于绘图方面的处理。但实际情况下,星体之间,面对面的那边由于比互相背向的一边离得远了一个直径的距离,受到的引力是不一样的,引力差于是就形成了潮汐力,在星体之间离得很远很远时,潮汐力很微小,但在星体离得很近时,这个力就很大,大到超过星星自体的引力时,就会让星星崩解。

我一开始想,如果能加入引力潮下的星体崩解就好了,但是仔细一想,涉及的计算量比较大,在pc上的玩具级模拟程序上,还是算了吧。

* 史瓦西半径

现在程序里的星体合并是出现在两星接触时,但在实际中,每个星星据引力大小都有一个半径范围,其他星体一但进入这个半径,就不可能再逃出,最终会坠入对方。

一般密度的星体,史瓦西半径可能会小于真实星体的半径,但密码很大的星体,史瓦西半径就可能会很大,比如黑洞。

所以,现在的程序对于普通天体的合并处理是正确的,但如果加入一个黑洞,不知道会出现什么事情,也许会自然地遵守这个法则?另一方面,如果加入黑洞的话,就应该把史瓦西半径做为黑洞的半径来处理,颜色就选黑色吧!

* 3d空间与视图

其实已经加入Z维的计算了,只是还没有采用3d视图来处理显示的问题,那个……OpenGL或是Dx3d什么的我还没心思下苦功夫去学习,所以,先就这样吧。

另外,昨天网友推荐的那个3d太阳系程序,我下载了看了,是固定轨道的简易演示,并不对真实物理效应进行模拟,3d酷一点点,但里面没物理学。

* 行星环

现在所有的行星都是用圆处理的。于是我遇上了土星这个奇葩……那个环没法贴图。

我想可以在现在的行星类中派生出一个有环行星的类,来额外画环。

 

 

源码已经更新:https://files.cnblogs.com/haoxiaobo/StarsScreenSaver.rar