在中心视口中移动对象

时间:2009-07-03 23:31:42

标签: language-agnostic graphics viewport

我正在建立一个基于力的物理模拟,其中几个粒子相互作用。粒子可以以这样的方式移动:静态视口很容易丢失它们(想象整个粒子组向右移动屏幕,视口显示空白背景)。

我目前的解决方案是通过找到x和y的最小值/最大值来跟踪粒子的“中心”,并使视口的中间跟随。它工作正常(无需找到真正的质心)。这是一个视觉:

Viewport

我的问题是我正在尝试添加使用鼠标手动拖动粒子的功能。我还没有找到一种优雅的方式来做到这一点。问题是视口坐标和模拟坐标之间的转换是不断变化的,因为视口遵循粒子的中心。

当我在粒子上按下鼠标时,我希望它在模拟中具有固定的位置(它忽略了它上面的所有力)。当我按下按钮移动鼠标时,我希望粒子在模拟中移动。我做到了这一点。但是,由于视口和其他仍在运动的粒子,它会产生令人不快的副作用。当鼠标被压下并静止但是它在屏幕上移动时,粒子不会在模拟中移动,因为所有粒子的中心都会改变并且视口会相应地调整。光标是静止的,因此粒子从其下方“移出”。当鼠标移动得如此轻微时,粒子会在光标下传送回来,因为光标的新位置代表完全不同的模拟坐标。

有没有上述副作用的良好,连贯的用户体验的任何建议?


我已经想到了:

  • 鼠标停止时暂停模拟
  • 鼠标停止时暂停视口更改
  • 在视口更改时移动鼠标光标(非常糟糕)

但他们都有其他不良副作用或从模拟中夺走价值。

此外,我认为这个问题是语言和平台不可知的,所以不要将文字和特定于实现的含义附加到“视口”,“视口坐标”或“模拟坐标”。将它们视为通用图形概念。

2 个答案:

答案 0 :(得分:1)

我认为不需要暂停模拟。正如您所描述的那样,您的鼠标输入(视图输入)似乎直接更改模型数据,并且在下次更新/刷新/发布任何内容时视图会相应更新。

也许您可以插入仅在“动画”期间使用的新单个粒子,并且它不会耦合到任何其他粒子。在引入此粒子时,您可以隐藏真实粒子(以及它的边缘)。因此,在移动鼠标时,您只更新此动画粒子的数据。当动画结束时(让鼠标移动),动画对象将被删除,真实粒子将更新其数据并再次显示。

在某种程度上,这是一种暂停形式,因为你在欺骗更新系统。粒子系统的数据在动画期间不会更新,当你实际上只是以图形方式欺骗用户时,它看起来就像是在移动真实系统的粒子。希望这有点意义,凌晨2点在这里:)

答案 1 :(得分:1)

更改调整视口的算法,以使用光标的位置作为转换的原点。这样,光标处的视口和模拟坐标将保持固定。您可以在按下鼠标时执行此操作,但如果始终执行该操作,也可能会产生令人满意的结果。

它使数学有些复杂化,但看起来你似乎没有太多的选择。