3

私は、いくつかの粒子が互いに相互作用している力ベースの物理シミュレーションをモデル化しています。パーティクルは、静的なビューポートが簡単に追跡できなくなるような方法で移動する可能性があります(パーティクルのグループ全体が画面から右に移動し、ビューポートに空白の背景が表示されると想像してください)。

私の現在の解決策は、xとyの最小/最大を見つけて粒子の「中心」を追跡し、ビューポートの中央をそれに従わせることです。正常に動作します(真の重心を見つける必要はありません)。ビジュアルは次のとおりです。

ビューポート

私の問題は、マウスを使ってパーティクルを手動でドラッグする機能を追加しようとしていることです。私はこれを行うためのエレガントな方法を見つけていません。問題は、ビューポートがパーティクルの中心に従うため、ビューポート座標とシミュレーション座標の間の変換が絶えず変化することです。

パーティクルをマウスで下に移動すると、シミュレーションでパーティクルの位置が固定されます(パーティクルにかかるすべての力が無視されます)。ボタンを押したままマウスを動かすと、シミュレーションでパーティクルを動かしたいと思います。私はこれを達成しました。ただし、ビューポートやその他のパーティクルがまだ動いているため、不快な副作用が発生します。マウスを押して静止しているとき、パーティクルはシミュレーションでは移動していませんが、すべてのパーティクルの中心が変化し、それに応じてビューポートが調整されるため、画面上でパーティクルは移動しています。カーソルが静止しているため、パーティクルはカーソルの下から「移動」します。マウスを少しだけ動かすと、カーソルの新しい位置が根本的に異なるシミュレーション座標を表すため、パーティクルはカーソルの下にテレポートします。

上記の副作用のない、優れた一貫性のあるユーザーエクスペリエンスのための提案はありますか?


私はすでに考えました:

  • マウスが下がっている間にシミュレーションを一時停止する
  • マウスが下がっている間、ビューポートの変更を一時停止します
  • ビューポートの変更に合わせてマウスカーソルを移動する(本当に悪い)

しかし、それらはすべて他の悪い副作用を持っているか、シミュレーションから価値を奪います。

また、この質問は言語やプラットフォームに依存しないと思うので、「ビューポート」、「ビューポート座標」、または「シミュレーション座標」に文字通りの実装固有の意味を付けないでください。それらを一般的なグラフィックの概念として扱います。

4

2 に答える 2

1

シミュレーションを一時停止する必要はないと思います。あなたが説明しているように、マウス入力(ビュー入力)がモデルデータを直接変更し、次の更新/フラッシュ/発行時にそれに応じてビューが更新されるようです。

おそらく、「アニメーション」中にのみ使用され、他のどの粒子にも結合されていない新しい単一の粒子を挿入できます。この粒子を導入している間、実際の粒子 (およびそのエッジ) を非表示にすることができます。したがって、マウスを動かしている間は、このアニメーション化されたパーティクルのデータのみが更新されます。アニメーションが終了すると (マウスを離すと)、アニメーション化されたオブジェクトが削除され、実際のパーティクルがそのデータで更新され、再び表示されます。

更新システムをごまかしているので、これは一時停止の一種です。パーティクル システムのデータはアニメーション中に更新されません。実際のシステムのパーティクルを動かしているように見えますが、実際にはグラフィカルにユーザーを騙しているだけです。これが意味をなすことを願っています、ここで午前2時:)

于 2009-07-04T00:09:35.453 に答える
1

ビューポートを調整するアルゴリズムを変更して、カーソルの位置を変換の原点として使用します。そうすれば、カーソルのビューポートとシミュレーション座標は固定されたままになります。マウスが押されているときにこれを行うこともできますが、常に行った方が良い結果が得られる場合もあります。

計算が多少複雑になりますが、選択肢が多すぎるとは思えません。

于 2009-07-04T00:37:35.520 に答える