それはクールなアイデアです。船の周りにある種の拡散勾配が必要です。考えられる3つの物理モデルがあります。
圧力勾配が再平衡する液体媒体のように見えます。つまり、粒子を通過すると、粒子は航跡に戻ります(ボートの後ろの水など)。この例では、パーティクルの位置は絶対的であり、レンダリング位置を一時的に変更するのはプレーヤーとの関係だけです。これは、厚い虫眼鏡を物の上に置いたときのようなもので、回折によって動くように見えますが、それはガラスを遠ざけるまでです。この場合、あなたの船はガラスです。
あなたが彼らを船から遠ざけ、彼らが動いたら動き続けることを望むなら。これは、圧力勾配がない(または非常に小さい)一般的な空の空間での標準的な物理学に似ています。
(1)と(2)のように、粒子が接近するにつれて素早く粒子を船から遠ざけたいと思っていますが、船がなくなると、粒子はゆっくりとバランスを取り直して、航跡で等距離になります。
3つのソリューションすべてに共通:船とともに移動する拡散フィールドが必要です。この例では、円形にします。次に、船とその領域内の各粒子との間でベクトルを検出し、v1と呼びます。そのベクトルに沿ってパーティクルを押し出します。どれだけ強く押し出すかは、船からの距離に依存します:use 1 - v1.magnitude
。この式は直線的な強度を与えますが、エッジに向かって強度が減少する円形の強度曲線のような何かを使用するように修正することができます。これにより、まるで船の周りに円形ではなく球形の圧力勾配があるかのように見えます。
解決策1の場合:レンダリングの更新ごとに、このベクトルによってそのパーティクルのレンダリング位置(つまり、スプライトの位置)を変更するだけです。この方法で行うため、これは純粋にレンダリング効果であり、パーティクルの実際の世界の位置には影響しません。したがって、ワールドポジションをレンダーオフセット(v1)に追加すると、パーティクルに近づいたり横に移動したりするとパーティクルがうまく移動し、通り過ぎる(背後にある)パーティクルがスムーズに元に戻ります。
解決策2の場合:ビュー位置にv1を適用するだけでなく、各ロジックの更新でパーティクルの位置に適用します。だから、p1.position += v1
。したがって、パーティクルに加速力を適用し、速度に変換します。おそらく、各パーティクルの速度を減衰させて、通過後に徐々に減速して停止するようにする必要があります。このソリューションにより、星雲内に粒子が再拡散することはないため、どのように星雲に粒子が集まるかを確認できます。現実的にはどれほど弱いかに関係なく、星雲にはその内部に圧力勾配があるため、あまり現実的ではないと確信しています。
解決策3:(2)と同じですが、この場合、パーティクルを再拡散する必要があります。これを簡単に行うには少し強引なアプローチですが、これらは粒子であり、したがって目を楽しませるだけなので、おそらく大きな関心領域をカバーする必要はありません(おそらくplayerPosition + maxPlayerSpeedPerTickの半径だけ、または何でも)長方形の領域は、ロジックの目的でそれを囲んでいます)。各パーティクルは、関心のあるエリア内にある他の各パーティクルに力を加えます。彼らは再び、互いの距離に基づいて力を加えます。関心領域全体の単一掃引ですべての粒子間力を計算し、単一掃引ですべての力を適用します。最後に、速度がゼロの粒子に対してのみこの粒子間力処理を実行するようにしてください。そして、与えられた粒子が最低速度に達すると、
さまざまな種類の拡散式などがありますが、この場合は簡単な解決策が最適だと思います。