如何正确地通过速度移动物体?

4
我最近开始尝试使用安卓进行一些操作,并且决定尝试制作一个基本的物理模拟器,但我遇到了一个小问题。
我有我的球对象,每个球都有一个速度向量,我将其移动的方法是在每次滴答声中将该向量添加到球的位置上。这种方法很有效,直到我发现这种方法存在问题。
当我尝试将重力应用于球时,我注意到当两个球靠近时,其中一个球会被弹射出去。
经过一些调试,我找到了这种情况发生的原因。以下是我计算重力和加速度的示例:
    //for each ball that isn't this ball
    for (Ball ball : Ball.balls)
        if (ball != this) {
            double m1 = this.getMass();
            double m2 = ball.getMass();
            double distance = this.getLocation().distance(ball.getLocation());
            double Fg = 6.674*((m1*m2)/(distance * distance));
            Vector direction = ball.getLocation().subtract(this.getLocation()).toVector();
            Vector gravity = direction.normalize().multiply(Fg / mass);
            this.setVeloctity(this.getVelocity().add(gravity));
        }

这是问题的核心 - 当球们靠得很近时,重力变得非常强(应该如此),因此速度也变得非常高,但由于我每个周期都添加向量到位置,并且向量的值非常高,其中一个球被弹出了。
那么这就带来了我的问题 - 除了添加向量之外,是否有更好的移动对象的方法?另外,是否有更好的处理重力的方法?
感谢您能提供的任何帮助。
2个回答

3
你可以尝试这个:

你可以试试这个:

acceleration.y = force.y / MASS; //to get the acceleration
force.y = MASS * GRAVITY_Constant; // to get the force
displacement.y = velocity.y * dt + (0.5f * acceleration.y * dt * dt); //Verlet integration for y displacment
position.y += displacement.y * 100; //now cal to position
new_acceleration.y = force.y / MASS; //cau the new acc
avg_acceleration.y = 0.5f * (new_acceleration.y + acceleration.y); //get the avg
velocity.y += avg_acceleration.y * dt; // now cal the velocity from the avg

加速度、速度、位移和位置是您的球的向量。

*注意:(dt = Delta Time)即当前帧与上一帧之间的时间差。


0

你需要研究问题的物理学。显然,将力或加速度添加到速度是一个不好的想法,物理单位无法匹配。

因此,在最原始的情况下,使用时间步长dt,你需要实现:

velocity = velocity + acceleration * dt

下一个需要考虑的问题是,在改变所有物体在给定时间的(位置和速度)状态之前,您需要首先累积所有力或者结果加速度的状态,然后同时改变它们在下一个时间步长的(近似)状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接