我正在尝试使用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]
任何人都能解释这种奇怪的行为或向我展示我做错了什么吗? 感谢。
答案 0 :(得分:0)
问题是你没有构建轨道运动的真实物理模型。
你需要做一些有点逼真的模拟,是构建一个简化的开普勒轨道模型。您还需要在极坐标(半径,角度)中工作并转换为x,y坐标。
您需要做的是在代码中为椭圆轨道构建开普勒轨道方程。
开普勒公式如下(有关详细信息,请参阅Wikipedia article on orbit modeling)
这用轨道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。我在自己的轨道物理实验室遇到了类似的问题,这很有用。