繁体   English   中英

如何正确地按速度移动对象?

[英]How do I move objects by velocity correctly?

我最近开始玩android并决定尝试制作一个基本的物理模拟器,但我遇到了一个小问题。

我有Ball的对象,每个球都有一个速度向量,我移动它的方法是将每个球的位置添加到球的位置。 在我注意到这种方法存在问题之前,它运作良好。

当我尝试将重力施加到球上时,我注意到当两个球彼此靠近时,其中一个球的速度很快。

经过一些调试后,我找到了发生这种情况的原因。 以下是我计算重力和加速度的示例:

    //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));
        }

这就是问题 - 当球变得非常接近时,重力变得非常高(应该如此),因此速度也变得非常高,但是因为我向每个刻度位置添加了矢量,并且矢量的值非常高,一个球被弹射出去了。

这让我想到了我的问题 - 除了添加向量之外,还有更好的方法来移动对象吗? 还有,有更好的方法来处理重力吗?

我感谢你们提供的任何帮助。

你可以试试这个:

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

(加速度,速度,位移和位置)是球的矢量。

* note(dt = Delta Time,即当前帧与前一帧之间的差值时间。

你需要研究问题的物理学。 显然,对速度添加力或加速度是一个坏主意,物理单位无法匹配。

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

velocity = velocity + acceleration * dt

要考虑的下一个问题是你需要先积累所有的力量。 在下一个时间步骤同时改变整个状态的(近似)状态之前,在给定时间对所有对象的状态(位置和速度)产生的加速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM