【问题标题】:Moving Objects in Center-of-Mass Viewport在质心视口中移动对象
【发布时间】:2009-07-04 08:37:35
【问题描述】:

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

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

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

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

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


我已经想到了:

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

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

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

【问题讨论】:

    标签: language-agnostic graphics viewport


    【解决方案1】:

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

    这会使数学变得有些复杂,但似乎您没有太多选择。

    【讨论】:

    • 这很有趣,我从来没有想过。鼠标向下会有一个快速跳跃,但在拖动粒子时会很愉快。我会回复你的:-)
    【解决方案2】:

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

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

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

    【讨论】:

    • 这将是一个选项,除了现在,选定的粒子确实会影响其他粒子,只是不会受到它们自身的影响。我确实需要让粒子“在”模拟中。所以不幸的是我不能玩图形技巧
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多