java - 如何正确地按速度移动物体?

标签 java android

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

我有我的 Ball 对象,每个球都有一个速度 vector ,我移动它的方式是在每次滴答时将所述 vector 添加到球的位置。 在我注意到这种方法存在问题之前,它一直运行良好。

当我尝试对球施加重力时,我注意到当两个球彼此靠近时,其中一个球会以很高的速度发射。

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

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

这就是问题所在 - 当球非常靠近时,重力变得非常高(应该如此)因此速度也变得非常高,但是因为我在每个刻度中添加 vector 到位置,并且 vector 的值是如此高,其中一个球被弹出。

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

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

最佳答案

你可以试试这个:

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

(加速度、速度、位移和位置)是球的 vector 。

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

关于java - 如何正确地按速度移动物体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36042929/

相关文章:

java - Spring DefaultMessageListenerContainer、ActiveMQ 和消息重新传递

java - 从 recyclerview 行内的项目调用新 Activity

java - 两个不同输入的交替字符

java - 如果 A extends B extends C,为什么我可以转换到 A 但得到转换到 C 的 ClassCastException?

java - Android 定时器的处理程序和可运行对象

java - 由 : java. lang.ClassNotFoundException 引起:在路径上找不到类 "android.support.v4.animation.AnimatorCompatHelper":DexPathList [[zip 文件

java - Selenium 网络驱动程序 :To enter an element into ul li text box

java - 开发一个似乎因无法调用虚拟方法而不断崩溃的应用程序

java - 将 Kotlin Parcelable Data Class 放入 java 包中不起作用

没有 requestLocationUpdates 不会触发 Android 地理围栏