プレイヤーと敵に反応するパーティクルを作成するにはどうすればよいですか?


38

現在、C ++で記述した独自のゲームエンジンを使用してゲームを作成しており、最新のdirectx SDKを使用しています。

このゲームはトップダウンのスペースシューティングゲームであり(かなり興味深いひねりを加えたものです)、プレイヤーが飛び回るような星雲効果を探しています。プレイヤーが船に飛び込んでくると、何百もの粒子が邪魔にならないように、触り心地の良い触感を試してみたいと思います。XBLAのGeomtry Warsで、パーティクルがプレイヤーの邪魔にならないようにする方法がやや気に入っています。

私はC ++に関しては経験豊富なプログラマーです。ただし、この効果の実装を開始する方法はわかりません。誰かが私が検討したいかもしれないクールなアイデアやデザインの選択肢を持っていますか?どんな深さでもお好きなところにお気軽にお答えください。

回答:


65

それはクールなアイデアです。船の周りにある種の拡散勾配が必要です。考えられる3つの物理モデルがあります。

  1. 圧力勾配が再平衡する液体媒体のように見えます。つまり、粒子を通過すると、粒子は航跡に戻ります(ボートの後ろの水など)。この例では、パーティクルの位置は絶対的であり、レンダリング位置を一時的に変更するのはプレーヤーとの関係だけです。これは、厚い虫眼鏡を物の上に置いたときのようなもので、回折によって動くように見えますが、それはガラスを遠ざけるまでです。この場合、あなたの船はガラスです。

  2. あなたが彼らを船から遠ざけ、彼らが動いたら動き続けることを望むなら。これは、圧力勾配がない(または非常に小さい)一般的な空の空間での標準的な物理学に似ています。

  3. (1)と(2)のように、粒子が接近するにつれて素早く粒子を船から遠ざけたいと思っていますが、船がなくなると、粒子はゆっくりとバランスを取り直して、航跡で等距離になります。

3つのソリューションすべてに共通:船とともに移動する拡散フィールドが必要です。この例では、円形にします。次に、船とその領域内の各粒子との間でベクトルを検出し、v1と呼びます。そのベクトルに沿ってパーティクルを押し出します。どれだけ強く押し出すかは、船からの距離に依存します:use 1 - v1.magnitude。この式は直線的な強度を与えますが、エッジに向かって強度が減少する円形の強度曲線のような何かを使用するように修正することができます。これにより、まるで船の周りに円形ではなく球形の圧力勾配があるかのように見えます。

解決策1の場合レンダリングの更新ごとに、このベクトルによってそのパーティクルのレンダリング位置(つまり、スプライトの位置)を変更するだけです。この方法で行うため、これは純粋にレンダリング効果であり、パーティクルの実際の世界の位置には影響しません。したがって、ワールドポジションをレンダーオフセット(v1)に追加すると、パーティクルに近づいたり横に移動したりするとパーティクルがうまく移動し、通り過ぎる(背後にある)パーティクルがスムーズに元に戻ります。

解決策2の場合:ビュー位置にv1を適用するだけでなく、各ロジックの更新でパーティクルの位置に適用します。だから、p1.position += v1。したがって、パーティクルに加速力を適用し、速度に変換します。おそらく、各パーティクルの速度を減衰させて、通過後に徐々に減速して停止するようにする必要があります。このソリューションにより、星雲内に粒子が再拡散することはないため、どのように星雲に粒子が集まるかを確認できます。現実的にはどれほど弱いかに関係なく、星雲にはその内部に圧力勾配があるため、あまり現実的ではないと確信しています。

解決策3:(2)と同じですが、この場合、パーティクルを再拡散する必要があります。これを簡単に行うには少し強引なアプローチですが、これらは粒子であり、したがって目を楽しませるだけなので、おそらく大きな関心領域をカバーする必要はありません(おそらくplayerPosition + maxPlayerSpeedPerTickの半径だけ、または何でも)長方形の領域は、ロジックの目的でそれを囲んでいます)。各パーティクルは、関心のあるエリア内にある他の各パーティクルに力を加えます。彼らは再び、互いの距離に基づいて力を加えます。関心領域全体の単一掃引ですべての粒子間力を計算し、単一掃引ですべての力を適用します。最後に、速度がゼロの粒子に対してのみこの粒子間力処理を実行するようにしてください。そして、与えられた粒子が最低速度に達すると、

さまざまな種類の拡散式などがありますが、この場合は簡単な解決策が最適だと思います。


メイト、残念ながら、私は現在あなたの答えを支持する評判がありません(そして、私はそれを値するよりも少ない一度しかできません)。あなたは私があなたの最初の解決策で探しているものを絶対に釘付けにしました。素晴らしい答え。正直に。ありがとう!
マットマクドナルド

完全な喜びマット、それは良い質問であり、脳を曲げる価値があります!
エンジニア

また、コードをほとんど変更せずに、ベルト内の小さな小惑星にこれを適用することもできます。再度、感謝します。
マットマクドナルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.