我正在建模一个基于力的物理模拟,其中几个粒子相互作用。粒子可以以这样一种方式移动,即静态视口很容易失去对它们的跟踪(想象整个粒子组向右移出屏幕,并且视口显示空白背景)。
我目前的解决方案是通过找到 x 和 y 的最小值/最大值来简单地跟踪粒子的“中心”,并使视口的中间跟随它。它工作正常(无需找到真正的质心)。这是一个视觉效果:
我的问题是我正在尝试添加使用鼠标手动拖动粒子的功能。我还没有找到一种优雅的方法来做到这一点。问题是视口坐标和模拟坐标之间的转换是不断变化的,因为视口跟随粒子的中心。
当我将鼠标放在一个粒子上时,我希望它在模拟中有一个固定的位置(它忽略它上面的所有力)。当我按下按钮移动鼠标时,我希望粒子在模拟中移动。我已经实现了这一点。但是,由于视口和其他仍在运动的粒子,它会产生令人不快的副作用。当鼠标被按下且静止时,粒子在模拟中并没有移动,但它在屏幕上移动,因为所有粒子的中心都发生了变化,并且视口也会相应调整。光标是静止的,因此粒子从其下方“移动”出来。当鼠标稍微移动时,粒子会传送回光标下方,因为光标的新位置代表完全不同的模拟坐标。
对于没有上述副作用的良好、连贯的用户体验有什么建议吗?
我已经想到了:
- 鼠标按下时暂停模拟
- 鼠标按下时暂停视口更改
- 随着视口的变化移动鼠标光标(真的很糟糕)
但它们都有其他不好的副作用或从模拟中带走价值。
另外,我认为这个问题与语言和平台无关,因此不要将文字和实现特定的含义附加到“视口”、“视口坐标”或“模拟坐标”。将它们视为通用图形概念。