私は、いくつかの粒子が互いに相互作用している力ベースの物理シミュレーションをモデル化しています。パーティクルは、静的なビューポートが簡単に追跡できなくなるような方法で移動する可能性があります(パーティクルのグループ全体が画面から右に移動し、ビューポートに空白の背景が表示されると想像してください)。
私の現在の解決策は、xとyの最小/最大を見つけて粒子の「中心」を追跡し、ビューポートの中央をそれに従わせることです。正常に動作します(真の重心を見つける必要はありません)。ビジュアルは次のとおりです。
私の問題は、マウスを使ってパーティクルを手動でドラッグする機能を追加しようとしていることです。私はこれを行うためのエレガントな方法を見つけていません。問題は、ビューポートがパーティクルの中心に従うため、ビューポート座標とシミュレーション座標の間の変換が絶えず変化することです。
パーティクルをマウスで下に移動すると、シミュレーションでパーティクルの位置が固定されます(パーティクルにかかるすべての力が無視されます)。ボタンを押したままマウスを動かすと、シミュレーションでパーティクルを動かしたいと思います。私はこれを達成しました。ただし、ビューポートやその他のパーティクルがまだ動いているため、不快な副作用が発生します。マウスを押して静止しているとき、パーティクルはシミュレーションでは移動していませんが、すべてのパーティクルの中心が変化し、それに応じてビューポートが調整されるため、画面上でパーティクルは移動しています。カーソルが静止しているため、パーティクルはカーソルの下から「移動」します。マウスを少しだけ動かすと、カーソルの新しい位置が根本的に異なるシミュレーション座標を表すため、パーティクルはカーソルの下にテレポートします。
上記の副作用のない、優れた一貫性のあるユーザーエクスペリエンスのための提案はありますか?
私はすでに考えました:
- マウスが下がっている間にシミュレーションを一時停止する
- マウスが下がっている間、ビューポートの変更を一時停止します
- ビューポートの変更に合わせてマウスカーソルを移動する(本当に悪い)
しかし、それらはすべて他の悪い副作用を持っているか、シミュレーションから価値を奪います。
また、この質問は言語やプラットフォームに依存しないと思うので、「ビューポート」、「ビューポート座標」、または「シミュレーション座標」に文字通りの実装固有の意味を付けないでください。それらを一般的なグラフィックの概念として扱います。