0

我想实现一个拖动功能,用户可以在工作区周围拖动对象。这当然是容易的一点。困难的一点是尝试使其成为物理上正确的拖动,其中包含由于扭矩力矩而产生的旋转(想象一下,只用一根手指在桌子上拖动一本书,拖动时它是如何旋转的?)。

有谁知道我在哪里可以找到关于如何编码的解释(仅限 2D,仅限矩形,不需要摩擦)?

非常感谢,大卫


编辑:

我写了一个小应用程序(有明显错误的行为),我希望它能比文字更好地传达我正在寻找的东西。C# (VS 2008) 源代码和编译的 exe 在这里


编辑2:

调整示例项目以提供可接受的行为。新的源代码(和编译的 exe)可在此处获得。用 C# 2008 编写。我提供此代码没有任何版权,请随意使用/修改/任何内容。无需通知我或提及我。

4

3 回答 3

1

这似乎是一个基本的物理问题。

你需要知道点击的位置,这会告诉你他们是在推还是拉3D。

每个项目都有属性,例如质量,也许还有空气阻力的信息,因为空气将有助于提供运动。

您还需要根据用户移动鼠标的速度做出不同的反应。

因此,他们可能能够以比可能更快的速度移动 2 吨重物,您只需要适应这一点,因为如果被拖动的对象比鼠标指针慢,用户将不会高兴。

于 2009-10-07T03:55:50.337 回答
1

扭矩只是垂直于施加力的点和物体质心之间的矢量投射的施加力。因此,如果垂直于直径拉动,则扭矩等于施加的力。如果直接拉离质心,则扭矩为零。

您通常希望通过对将原始鼠标按下点连接到鼠标当前位置(在对象局部坐标中)的弹簧进行建模来做到这一点。使用弹簧和一些摩擦可以稍微平滑鼠标的运动。


我听说过关于 Chipmunk 作为 2D 物理包的好消息:

http://code.google.com/p/chipmunk-physics/


好了,时间不早了,我要睡觉了。但这里有一些起点。您可以在一个坐标空间中进行所有计算,也可以为每个对象定义一个坐标空间。在大多数动画系统中,人们使用每个对象的坐标空间,并使用变换矩阵进行转换,因为它使数学更容易。

计算的基本顺序是:

  1. 在鼠标按下时,您进行命中测试,并存储事件的坐标(在对象坐标空间中)。

  2. 当鼠标移动时,您会创建一个表示移动距离的矢量。

  3. 弹簧施加的力为 k * M,其中 M 是从步骤 1 开始的初始鼠标按下点与当前鼠标位置之间的距离。k 是弹簧的弹簧常数。

  4. 从最初的鼠标按下点开始,将该向量投影到两个方向向量上。一个方向是朝向对象的中心,另一个方向是 90 度。

  5. 投射到对象中心的力会将其移向鼠标光标,另一个力是绕轴的扭矩。物体加速多少取决于它的质量,而旋转加速度取决于角动量。

  6. 物体在其中移动的介质的摩擦力和粘度会导致阻力,这会随着时间的推移简单地减少物体的运动。


或者,也许你只是想伪造它。在这种情况下,只需存储矩形的 (x,y) 位置及其当前旋转 phi。然后,这样做:

  1. 在世界坐标中捕获鼠标按下的位置
  2. 鼠标移动时,根据鼠标位置的变化移动框
  3. 计算鼠标和对象中心之间的角度(atan2 在这里很有用),以及对象中心和初始鼠标按下点之间的角度。将两个角度之间的差异添加到矩形的旋转中。
于 2009-10-07T04:35:58.997 回答
0

哪种语言?

这是C中的一堆二维变换

于 2009-10-07T04:13:13.493 回答