使用物理行为拖放

时间:2009-10-07 03:50:38

标签: user-interface graphics 2d draggable

我想实现拖动功能,用户可以在工作区周围拖动对象。那当然很容易。硬盘是尝试使它成为一个物理上正确的阻力,由于扭矩瞬间结合了旋转(想象一下只用一根手指在桌子上拖动一本书,你在拖动时如何旋转?)。

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

非常感激, 大卫


编辑:

我写了一个小应用程序(显然有错误的行为),我希望能传达出我所寻找的东西,而不是言语。 C# (VS 2008) source and compiled exe here


编辑2:

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

3 个答案:

答案 0 :(得分:1)

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

你需要知道点击的位置,并告诉你他们是在推动还是拉动,所以,虽然你是在2D中做这个,你的计算需要是3D,你知道他们点击的位置将是3D。

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

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

因此,它们可能能够比可能的速度更快地移动2吨重量,并且您只需要适应它,因为如果被拖动的对象比鼠标指针慢,用户将不会感到高兴。 / p>

答案 1 :(得分:1)

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

您通常希望通过建模将原始鼠标按下点连接到鼠标当前位置(在对象本地坐标中)的弹簧来实现此目的。使用弹簧和一些摩擦使鼠标的运动平滑一点。


我听说过Chipmunk作为2D物理包的好处:

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


好的,现在已经很晚了,我需要睡觉。但这里有一些起点。您可以在一个坐标空间中执行所有计算,也可以为每个对象定义一个坐标空间。在大多数动画系统中,人们使用每个对象的坐标空间,并使用transformation matrices进行转换,因为它使数学更容易。

基本的计算顺序是:

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

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

  3. 弹簧伸展的力是k * M,其中M是步骤1的初始鼠标点与当前鼠标位置之间的距离。 k是弹簧的弹簧常数。

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

  5. 投射到物体中心的力将使其朝向鼠标光标移动,另一个力是围绕轴的扭矩。物体加速的程度取决于物体的质量,旋转加速度取决于角动量。

  6. 物体移动的介质的摩擦力和粘度会导致阻力,这会减少物体随时间的运动。


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

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

答案 2 :(得分:0)

使用哪种语言?

Here's a bunch of 2d transforms in C