扭矩只是垂直于施加力的点和物体质心之间的矢量投射的施加力。因此,如果垂直于直径拉动,则扭矩等于施加的力。如果直接拉离质心,则扭矩为零。
您通常希望通过对将原始鼠标按下点连接到鼠标当前位置(在对象局部坐标中)的弹簧进行建模来做到这一点。使用弹簧和一些摩擦可以稍微平滑鼠标的运动。
我听说过关于 Chipmunk 作为 2D 物理包的好消息:
http://code.google.com/p/chipmunk-physics/
好了,时间不早了,我要睡觉了。但这里有一些起点。您可以在一个坐标空间中进行所有计算,也可以为每个对象定义一个坐标空间。在大多数动画系统中,人们使用每个对象的坐标空间,并使用变换矩阵进行转换,因为它使数学更容易。
计算的基本顺序是:
在鼠标按下时,您进行命中测试,并存储事件的坐标(在对象坐标空间中)。
当鼠标移动时,您会创建一个表示移动距离的矢量。
弹簧施加的力为 k * M,其中 M 是从步骤 1 开始的初始鼠标按下点与当前鼠标位置之间的距离。k 是弹簧的弹簧常数。
从最初的鼠标按下点开始,将该向量投影到两个方向向量上。一个方向是朝向对象的中心,另一个方向是 90 度。
投射到对象中心的力会将其移向鼠标光标,另一个力是绕轴的扭矩。物体加速多少取决于它的质量,而旋转加速度取决于角动量。
物体在其中移动的介质的摩擦力和粘度会导致阻力,这会随着时间的推移简单地减少物体的运动。
或者,也许你只是想伪造它。在这种情况下,只需存储矩形的 (x,y) 位置及其当前旋转 phi。然后,这样做:
- 在世界坐标中捕获鼠标按下的位置
- 鼠标移动时,根据鼠标位置的变化移动框
- 计算鼠标和对象中心之间的角度(atan2 在这里很有用),以及对象中心和初始鼠标按下点之间的角度。将两个角度之间的差异添加到矩形的旋转中。