2009-07-03 29 views
3

我正在建模一个基于力的物理模拟,其中有几个粒子彼此交互。粒子可以这样移动,即静态视口很容易失去它们的踪迹(想象一下,整组粒子从屏幕向右移动,视口显示空白背景)。在质心中移动对象视口

我目前的解决方案是简单地寻找X和Y的的最小/最大跟踪粒子的“中心”,并视口的中间遵循。它工作正常(不需要找到质量的真正中心)。这里有一个视觉:

Viewport

我的问题是我试图手动添加到用鼠标拖动颗粒的能力。我还没有找到一个优雅的方式来做到这一点。问题是视口坐标和模拟坐标之间的转换不断变化,因为视口跟随着粒子的中心。

当我按下鼠标上的一个微粒我希望它有在模拟一个固定的位置(它忽略了它所有的力量)。当我按下鼠标按钮时,我想让粒子在模拟中移动。我已经实现了这一点。但是,由于视口和仍在运动的其他粒子,它会产生令人不快的副作用。当鼠标被按下并静止时,粒子不会在模拟中移动,但它会在屏幕上移动,因为所有粒子的中心会发生变化,并且视口会相应地进行调整。光标是静止的,所以粒子从它下面“移出”。当鼠标轻微移动时,由于光标的新位置表示完全不同的模拟坐标,所以粒子传送回光标下。

对于没有上述副作用的一个很好的,一致的用户体验有什么建议?


我已经想到:

  • 暂停模拟,同时按下鼠标时
  • 暂停视变化,同时按下鼠标时
  • 将鼠标光标移动视口变化(真的很差)

但他们都有其他不良的副作用或t远离模拟的价值。

另外,我觉得这个问题是语言和平台无关的,所以不要附上文字和实现特定的含义为“视口”,“视口坐标”,或“模拟坐标”。将它们视为通用图形概念。

回答

1

变化,调整视使用作为转型的起源光标的位置的算法。这样,光标处的视口和模拟坐标将保持不变。您可以在按下鼠标时执行此操作,但如果始终执行该操作,则可能会获得令人满意的结果。

它的数学复杂几分,但它似乎并不像你留下了太多的选择。

+0

这是非常有趣的,我从来没有想到这一点。鼠标移动会有一个快速跳转,但在拖动这个粒子时会很愉快。我会尽快给您回复 :-) – colithium 2009-07-04 03:43:55

1

我不认为有必要暂停模拟。正如你所描述的,似乎你的鼠标输入(视图输入)直接改变了模型数据,并且当下一次更新/刷新/发出任何内容时,视图也会相应地更新。

也许你可以插入一个新的单粒子说,“动画”期间唯一的使用,这不是连接到任何其它颗粒。在引入这个粒子的同时,你可以隐藏真实粒子(以及它的边缘)。所以在移动鼠标的时候,你只需要更新这个动画粒子的数据。当动画结束时(让鼠标移动),动画对象将被删除,实际粒子将更新其数据并再次显示。

在一个方式,这是一个停顿的形式,因为你欺骗更新系统。动画期间不更新粒子系统的数据,它只是看起来像要移动的实际系统的粒子,当你实际上只是欺骗用户图形。希望这有一定道理,2日上午在这里:)

+0

这将是除了因为它代表现在,所选择的颗粒确实会影响其他粒子,它只是没有得到自己受他们影响的选项。我确实需要将粒子保持在模拟中。所以很遗憾我无法播放图形花样 – colithium 2009-07-04 03:47:08