Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 拖动+;随身体行为而下降_User Interface_Graphics_2d_Draggable - Fatal编程技术网

User interface 拖动+;随身体行为而下降

User interface 拖动+;随身体行为而下降,user-interface,graphics,2d,draggable,User Interface,Graphics,2d,Draggable,我想实现一个拖动功能,用户可以在工作区中拖动对象。这当然是容易的一点。困难的一点是尝试使其成为一个物理上正确的拖动,其中包含由于扭矩力矩而产生的旋转(想象一下,仅使用一个手指在桌子上拖动一本书,它在拖动时如何旋转?) 有人知道我在哪里可以找到关于如何编码的解释吗(仅二维,仅矩形,无需摩擦) 非常感谢, 大卫 编辑: 我写了一个小应用程序(行为明显错误),我希望它能比文字更好地传达我所寻找的东西 编辑2: 调整示例项目以提供可接受的行为。新的源代码(和编译的exe)可用。用C#2008写成。我

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

有人知道我在哪里可以找到关于如何编码的解释吗(仅二维,仅矩形,无需摩擦)

非常感谢, 大卫


编辑:

我写了一个小应用程序(行为明显错误),我希望它能比文字更好地传达我所寻找的东西


编辑2:


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

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

你需要知道点击的位置,这将告诉你他们是在推还是拉,所以,尽管你是在2D中进行这项工作,你的计算需要在3D中进行,你对他们点击位置的感知将在3D中进行

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

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

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

哪种语言


扭矩是施加力的点和物体质心之间垂直于矢量投影的作用力。所以,如果你垂直于直径拉动,扭矩等于施加的力。如果直接远离质心,扭矩为零

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


我听说花栗鼠作为2D物理软件包有很多好处:


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

计算的基本顺序是:

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

  • 当鼠标移动时,您将创建一个 表示距离的向量 感动

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

  • 从鼠标初始向下点开始,将该向量投影到两个方向向量上。一个方向朝向对象的中心,另一个方向与该方向成90度角

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

  • 物体所移动的介质的摩擦力和粘度会产生阻力,这只会减少物体随时间的运动


  • 或者,也许你只是想假装。在这种情况下,只需存储矩形的(x,y)位置及其当前旋转φ。然后,执行以下操作:

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

  • 嗨,詹姆斯,这远远超出了我要找的范围。不需要考虑与地平面的摩擦,不需要处理不同质量的物体,不需要与其他物体碰撞,当然也不需要考虑气流。我甚至不确定我想让物体在我放开鼠标后继续移动。@David Rutten-如果你不考虑空气摩擦力和速度,你怎么计算会发生什么?如果我点击物体的某一部分并拉动,什么力量会使它旋转?@James,物体有围绕质心旋转的倾向。如果我把物体拉到这个点以外的任何地方,它都会平移和旋转。如果运动速度足够慢,物体的动量就可以忽略。我可以阅读很多语言,但这最终会出现在C#或VB.NET中。该链接的源确实讨论了变换,但没有讨论如何从拖动向量计算这些变换。感谢Mark,拖动角度一定是等式的一部分,只是还没有找到一个很好的方法来合并它。(我编辑了原始帖子,并在示例应用程序中添加了下载链接)。你有没有关于如何构造(和求解)这样一个弹簧系统的例子?我担心你会问一个例子:-)我已经有一段时间没有这样做了,但我会通过上面的一些等式…嘿,任何好事都会受到惩罚。我一直在浏览花栗鼠,它确实令人印象深刻。但我犹豫是否将整个项目添加到我的应用程序中,仅仅是为了允许旋转盒子。我很确定一定有一种模仿物理的好方法