模拟圆周运动/切向加速度

Modelling circular motion / tangential acceleration

以下伪代码适用于模拟线性加速度(对每个时间刻度应用 calculateNextStepdoNextStep):

class myObject{

    vector positionVector
    vector velocityVector
    vector accelerationVector
    vector forceVector

    function calculateNextStep(){
        resetForceVector()
        calculateNetForces()
    }

    function doNextStep(){
        accelerationVector = forceVector.getCopy()
        accelerationVector.divideBy(mass)
        velocityVector.add(accelerationVector)
        positionVector.add(velocityVector)
    }
}

我的理解是,对于圆周运动,我们需要施加一个与物体速度正交的力。该力的大小将决定圆的半径:

    function calculateNextStep() {
        resetForceVector()
        orthogonalForce = velocityVector.getCopy.getOrthogonalVector()
        orthogonalForce.setLength(sizeOfForce)
    }

当我应用这种方法时,对象不会沿圆形路径移动。相反,它向外盘旋,速度增加。

我认为这是因为切向力仅瞬间施加,即。一旦物体移动,切向力就会相应地改变,但我不知道如何在我的模型中考虑到这一点。

我想这个问题之前已经解决了,但找不到任何东西。我应该应用更正项吗?与极限/积分有关?

你的假设是对的。问题出在切向力上。

但是你计算切向力的方式有两个问题:

  1. 你提到的,力应该是瞬间施加的。
  2. 计算力的方式,旋转中心在整个模拟过程中发生变化。

这两个问题都可以通过减少时间步长和增加迭代次数来解决,但这些都是硬件限制的,所以你最终会在那里触底。

解决这些问题的更好方法是使用不同的模型:

使用保守力(例如重力、静电力、连接您的物体和中心的绳索的力……)允许系统在开始螺旋时自行纠正(如果您的物体离开所需的位置)半径,保守势力将确保它回来)。

这里是重力的示例实现:

orthogonalVector = centerPoint - positionVector;
float value = orthogonalVector.value();
float scalar = gravityConstant*centerMass/pow(value, 3);
accelerationVector = scalar*orthogonalVector;

这个问题是基于尝试将线性力学应用于 angular 力学问题!

圆周运动只有在力与运动正交且运动方向为转向时才会发生!

我通过向模型添加 angular 速度解决了这个问题

class myObject{

    vector positionVector
    vector velocityVector
    vector accelerationVector
    vector forceVector
    scalar mass

    scalar torque
    scalar angularAccelleration
    scalar angularVelocity
    scalar orientation
    scalar rotationalInertia

    function calculateNextStep(){
        resetForceVector()
        angularAccelleration = 0
        calculateNetForces()

    }

    function doNextStep(){
        accelerationVector = forceVector.getCopy()
        accelerationVector.divideBy(mass)
        velocityVector.add(accelerationVector)
        positionVector.add(velocityVector)

        angularAcceleration = torque / rotationalInertia
        angularVelocity += angularAccelleration
        orientation += angularVelocity

    }
}