3

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

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

视口

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

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

对于没有上述副作用的良好、连贯的用户体验有什么建议吗?


我已经想到了:

  • 鼠标按下时暂停模拟
  • 鼠标按下时暂停视口更改
  • 随着视口的变化移动鼠标光标(真的很糟糕)

但它们都有其他不好的副作用或从模拟中带走价值。

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

4

2 回答 2

1

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

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

在某种程度上,这是一种暂停,因为你在欺骗更新系统。粒子系统的数据在动画过程中不会更新,看起来就像你在移动真实系统的粒子,而实际上你只是在图形上欺骗用户。希望这是有道理的,凌晨 2 点在这里 :)

于 2009-07-04T00:09:35.453 回答
1

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

它在某种程度上使数学复杂化,但似乎您没有太多选择。

于 2009-07-04T00:37:35.520 回答