我正在建立一个基于力的物理模拟,其中几个粒子相互作用。粒子可以以这样的方式移动:静态视口很容易丢失它们(想象整个粒子组向右移动屏幕,视口显示空白背景)。
我目前的解决方案是通过找到x和y的最小值/最大值来跟踪粒子的“中心”,并使视口的中间跟随。它工作正常(无需找到真正的质心)。这是一个视觉:
我的问题是我正在尝试添加使用鼠标手动拖动粒子的功能。我还没有找到一种优雅的方式来做到这一点。问题是视口坐标和模拟坐标之间的转换是不断变化的,因为视口遵循粒子的中心。
当我在粒子上按下鼠标时,我希望它在模拟中具有固定的位置(它忽略了它上面的所有力)。当我按下按钮移动鼠标时,我希望粒子在模拟中移动。我做到了这一点。但是,由于视口和其他仍在运动的粒子,它会产生令人不快的副作用。当鼠标被压下并静止但是它在屏幕上移动时,粒子不会在模拟中移动,因为所有粒子的中心都会改变并且视口会相应地调整。光标是静止的,因此粒子从其下方“移出”。当鼠标移动得如此轻微时,粒子会在光标下传送回来,因为光标的新位置代表完全不同的模拟坐标。
有没有上述副作用的良好,连贯的用户体验的任何建议?
我已经想到了:
但他们都有其他不良副作用或从模拟中夺走价值。
此外,我认为这个问题是语言和平台不可知的,所以不要将文字和特定于实现的含义附加到“视口”,“视口坐标”或“模拟坐标”。将它们视为通用图形概念。
答案 0 :(得分:1)
我认为不需要暂停模拟。正如您所描述的那样,您的鼠标输入(视图输入)似乎直接更改模型数据,并且在下次更新/刷新/发布任何内容时视图会相应更新。
也许您可以插入仅在“动画”期间使用的新单个粒子,并且它不会耦合到任何其他粒子。在引入此粒子时,您可以隐藏真实粒子(以及它的边缘)。因此,在移动鼠标时,您只更新此动画粒子的数据。当动画结束时(让鼠标移动),动画对象将被删除,真实粒子将更新其数据并再次显示。
在某种程度上,这是一种暂停形式,因为你在欺骗更新系统。粒子系统的数据在动画期间不会更新,当你实际上只是以图形方式欺骗用户时,它看起来就像是在移动真实系统的粒子。希望这有点意义,凌晨2点在这里:)
答案 1 :(得分:1)
更改调整视口的算法,以使用光标的位置作为转换的原点。这样,光标处的视口和模拟坐标将保持固定。您可以在按下鼠标时执行此操作,但如果始终执行该操作,也可能会产生令人满意的结果。
它使数学有些复杂化,但看起来你似乎没有太多的选择。