计算2D精灵的旋转力


35

我想知道是否有人有一种优雅的方式来计算以下情况。

我有一个(n)个正方形,随机形状的对象,但我们会假装它们都是矩形。

我们没有重力,因此从上到下的角度考虑空间中的物体。我在一个特定的正方形上向对象施加力(如下图所示)。

施加力量

如何根据所施加的力在所施加的位置计算旋转角度。如果应用在中心方块中,它将笔直。我离开中心越远,应该如何表现?如何计算转速?


随着对象旋转,随着时间的推移,您想对力进行什么操作?它是否总是沿相同方向应用于相同的正方形?它会沿着对象的边缘“扫描”吗?根据您所提供的信息,您只能获得相应的旋转力(又称扭矩),但是如果您想从中得出旋转速度,则需要提供脉冲(而不是力)或说明如何随时间推移应施加力。
sam hocevar

老实说,对于physics.stackexchange.com,这可能是一个更好的问题,因为这完全是基本力学的问题。
BlueRaja-Danny Pflughoeft

Answers:


44

您正在尝试计算扭矩。扭矩取决于作用力F,作用点和物体的质心。

1)质量中心。定义对象的质心。

2)应用的点:定义该力作用在点。

3)力矩臂:以上定义的两点之间的距离。

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4)角力:将力F分为两个正交向量,一个正交于3)中的直线,一个正交。平行分量不影响角动量。垂直的做。您可以通过矢量投影计算平行分量。您可以从原始值中减去该值以获得垂直分量。用伪代码(dot表示点积)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5)扭矩:力的垂直分量乘以力矩臂的长度。

Vector angularForce
Vector torque = angularForce * momentArm.Length

从扭矩到角速度:

1)转动惯量:定义给定对象具有多少转动惯量。例如,与相同质量的球体相比,旋转长杆需要更多的扭矩。如果您不关心现实主义,则可以假设惯性矩是相对于质量的,或者可以完全忽略对象的形状和质量。

2)角加速度

Vector angularAcceleration = torque / momentOfInertia

3)角速度:只要施加扭矩,角速度就会持续增加。因此,公式大致为“时间T处的角速度是直到T的角加速度的累积和”。这用伪代码表示为

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

但是,关于最重要的信息,我最不清楚的部分是如何确定扭矩力。正如您所描述的,我已经安装了所有组件。
jgallant 2011年

@Jon:您具有组件,这意味着您具有步骤1-3,并且不知道如何计算步骤4?这主要是棘手的步骤。我将在此处添加更多细节。
Jimmy

3
方向是角速度的累积总和,这orientation += angularVelocity * elapsedSeconds是错误的,因为它会高估时间步长上的速度,这意味着不同的帧速率将给出不同的方向。合适的公式为:float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;。另外,由于没有重力,我建议改用“质心”。+1是一个很好的解释。
sam hocevar

1
垂直力的一部分将起到加速质心的作用,并且当力施加得更靠近质心时,此因子会增加。答案很好,也很明确,但在这方面似乎还不完整。
山姆·沃特金斯

为了回答我自己的评论,我正在阅读Chris Hecker的有关物理学的文章:chrishecker.com/Rigid_body_dynamics。事实证明,根据F = ma或a2 = a1 + p,在任何点上的力或冲动都会对质心产生众所周知的影响,就像物体无法旋转一样。这遵循线性动量守恒定律。垂直于半径的分力也会引起扭矩和角动量的变化,如吉米的答案所述。
山姆·沃特金斯

7

如果力不是太强,则使用连接它们的多个点和弹簧来模拟旋转要容易得多。在这种情况下,您仅假设形状由多个由弹簧连接的点组成。每个点代表质量,形状上的其他所有事物的质量都等于零。

弹簧和圆点

上图中的黑点表示质量,红线表示弹簧。然后只需施加力即可,只需将其施加到最近的点上,您就会看到对象将随您的意愿旋转。为了使您的形状看起来像实体结构,最好定义高阻尼值和高k值的弹簧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.