2D轨道物理模型显示奇怪的行为

时间:2015-06-20 17:49:59

标签: python pygame physics game-physics

我正在尝试使用pygame创建一个模拟基本轨道物理的2D环境。然而,当我运行它时,它展示了一些weird behaviour(编辑:和一些weirder behaviour),例如卫星从x和y轴反弹,卫星沿着轴向波浪状移动太阳。下面是计算由中央太阳引起的身体加速度的代码。 BM是体重,BP是体位[x,y],SM是太阳质量,SP是太阳位置[x,y]。

public class MenuItemHolder extends RecyclerView.ViewHolder
    {
        TextView menuItemTV;
        TextView menuItemPriceTV;
        ImageView cartIV;
        int selectedPosition;
        Boolean cartPressed = false;
        CardView itemCV;

        MenuItemHolder(View itemView)
        {
            super(itemView);
            menuItemTV = (TextView)itemView.findViewById(R.id.menuItem);
            menuItemPriceTV = (TextView)itemView.findViewById(R.id.itemPrice);
            itemCV = (CardView)itemView.findViewById(R.id.itemCV);
            cartIV = (ImageView) itemView.findViewById(R.id.cart);

            //Event handler for clicking on the whole card
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    selectedPosition = getPosition();
                    Log.i("Position", "Position = " + selectedPosition);
                }
            });

            cartIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Log.i("Position", "Cart = " + menuItemTV.getText());
                    if(!cartPressed)
                    {
                        cartIV.setImageResource(R.drawable.ic_cart_blue);
                        cartPressed = true;
                    }
                    else {
                        cartIV.setImageResource(R.drawable.ic_cart_grey);
                        cartPressed = false;
                    }
                }
            });


        }
    }

然后在以下上下文中使用该函数:

def CalcGrav(BM,BP,SM,SP):  
    Dist = SubList(BP,SP)  
    Mass = BM*SM/100  
    for i in range(0,2):  
        if(Dist[i] == 0):  
            Dist[i] += 0.01  
    AV = [-(Mass/Dist[0]),-(Mass/Dist[1])]  
return AV  

SumList(A,B)只是将列表的项目加在一起:(1,3)+(2,6)=(3,9)
当前速度矢量和加速度矢量存储为列表:[x,y]

任何人都能解释这种奇怪的行为或向我展示我做错了什么吗? 感谢。

3 个答案:

答案 0 :(得分:0)

问题是你没有构建轨道运动的真实物理模型。

你需要做一些有点逼真的模拟,是构建一个简化的开普勒轨道模型。您还需要在极坐标(半径,角度)中工作并转换为x,y坐标。

您需要做的是在代码中为椭圆轨道构建开普勒轨道方程。

开普勒公式如下(有关详细信息,请参阅Wikipedia article on orbit modeling

enter image description here

这用轨道v的角度(实际上是希腊语nu)描述了轨道r的半径,其中角度为0°" periapsis"这意味着轨道体和中心体最接近的点。

你需要将自己的偏心率(e)定义为0到1之间的某个值 - 我建议接近地球轨道偏心率的东西,大约0.02。那会给你一个近乎圆形的轨道。如果你想要一个更椭圆的,增加偏心率,但不要超过1.0。

类似地,a是半长轴,即椭圆的最长轴的一半。要么定义一个对你的游戏坐标有意义的值,要么你想用体质计算它,你需要在开普勒轨道上查找一些参考文献,从上面的维基百科页面开始。

甚至开普勒模型也从实际轨道力学中大大简化,但它至少会产生半现实的游戏模拟。

答案 1 :(得分:0)

事实证明它比这简单得多。我正在划分个别的x,y距离,当我需要做的是计算出朝向太阳的矢量,计算两个物体之间的直线距离,然后将矢量的两个部分除以该距离的平方:

def CalcGrav(MM,MP,SM,SP):
    Vect = SubList(SP,MP)
    D = math.sqrt(Vect[0]**2 + Vect[1]**2)**2
    Vect = TimesList(Vect,[1/D,1/D])
    return Vect

答案 2 :(得分:0)

尝试较小的步长(较小的距离增量)。例如0.002而不是0.01。我在自己的轨道物理实验室遇到了类似的问题,这很有用。