我想知道是否有人有一个优雅的方法来计算下面的场景。
我的目标是(n)个正方形,随机形状,但我们会假装它们都是矩形。
我们处理的不是重力,所以从自上而下的角度来考虑太空中的物体。我在一个特定的正方形上对物体施加力(如下图所示)。
如何根据所施加的力,在所施加的位置上计算旋转角度。如果把它放在正中广场,它会一直往前走。我离中心越远它该怎么做?如何计算转速?
发布于 2011-11-10 12:32:31
你在计算扭矩。扭矩取决于物体的作用力F、作用点和质心。
1)质心。定义物体的质心。
2)应用点:定义力作用的点。
( 3)力矩臂:上述两点之间的距离。
Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass
( 4)角力:将你的力F分成两个正交矢量,一个与直线平行,一个垂直。平行分量不影响角动量。垂直的那个有。您可以通过矢量投影计算并行组件。,你可以从原始部分减去它,得到垂直分量。在伪码中(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;
发布于 2011-11-10 14:18:18
如果力不太强,用多个点和泉连接它们来模拟旋转要容易得多。在这种情况下,你只需假设你的形状由多个点组成,由弹簧连接。每个圆点代表质量,其他形状的东西的质量等于零。
上图中,黑点代表群众,红线代表弹簧。然后,要施加力,你只需要把它应用到最近的点上,你就会看到你的物体会像你喜欢的那样旋转。为了使你的形状看起来像一个坚固的结构,最好定义一个高阻尼值和高k值的弹簧。
https://gamedev.stackexchange.com/questions/19634
复制