模拟圆周运动/切向加速度
Modelling circular motion / tangential acceleration
以下伪代码适用于模拟线性加速度(对每个时间刻度应用 calculateNextStep
和 doNextStep
):
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)
}
当我应用这种方法时,对象不会沿圆形路径移动。相反,它向外盘旋,速度增加。
我认为这是因为切向力仅瞬间施加,即。一旦物体移动,切向力就会相应地改变,但我不知道如何在我的模型中考虑到这一点。
我想这个问题之前已经解决了,但找不到任何东西。我应该应用更正项吗?与极限/积分有关?
你的假设是对的。问题出在切向力上。
但是你计算切向力的方式有两个问题:
- 你提到的,力应该是瞬间施加的。
- 计算力的方式,旋转中心在整个模拟过程中发生变化。
这两个问题都可以通过减少时间步长和增加迭代次数来解决,但这些都是硬件限制的,所以你最终会在那里触底。
解决这些问题的更好方法是使用不同的模型:
使用保守力(例如重力、静电力、连接您的物体和中心的绳索的力……)允许系统在开始螺旋时自行纠正(如果您的物体离开所需的位置)半径,保守势力将确保它回来)。
这里是重力的示例实现:
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
}
}
以下伪代码适用于模拟线性加速度(对每个时间刻度应用 calculateNextStep
和 doNextStep
):
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)
}
当我应用这种方法时,对象不会沿圆形路径移动。相反,它向外盘旋,速度增加。
我认为这是因为切向力仅瞬间施加,即。一旦物体移动,切向力就会相应地改变,但我不知道如何在我的模型中考虑到这一点。
我想这个问题之前已经解决了,但找不到任何东西。我应该应用更正项吗?与极限/积分有关?
你的假设是对的。问题出在切向力上。
但是你计算切向力的方式有两个问题:
- 你提到的,力应该是瞬间施加的。
- 计算力的方式,旋转中心在整个模拟过程中发生变化。
这两个问题都可以通过减少时间步长和增加迭代次数来解决,但这些都是硬件限制的,所以你最终会在那里触底。
解决这些问题的更好方法是使用不同的模型:
使用保守力(例如重力、静电力、连接您的物体和中心的绳索的力……)允许系统在开始螺旋时自行纠正(如果您的物体离开所需的位置)半径,保守势力将确保它回来)。
这里是重力的示例实现:
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
}
}