私は最近MW2のようなゲームをプレイしていますが、プログラマーとして、ゲームをどのように没入型にするのかを自問する傾向があります。たとえば、弾丸の速度をシミュレートする方法。
NPCが銃から銃弾を発射すると、銃弾は実際に銃から指定されたターゲットに移動しますか、それともこの部分を完全に無視してターゲットに銃弾の穴を開けますか?
弾丸が実際に銃からターゲットまで移動している場合、実際にどの速度で移動していますか?
私は最近MW2のようなゲームをプレイしていますが、プログラマーとして、ゲームをどのように没入型にするのかを自問する傾向があります。たとえば、弾丸の速度をシミュレートする方法。
NPCが銃から銃弾を発射すると、銃弾は実際に銃から指定されたターゲットに移動しますか、それともこの部分を完全に無視してターゲットに銃弾の穴を開けますか?
弾丸が実際に銃からターゲットまで移動している場合、実際にどの速度で移動していますか?
回答:
ほとんどのFPSゲームは、実際のゲームプレイにレイキャスティングを使用します。弾丸は即座に移動し、発射されるとターゲットに命中します。
しかし、ほとんどのゲームは「偽の」トレーサーの使用も採用しています。3ショットごと、またはその他の間隔ごとに、トレーサーが弾丸とともに発射されます。トレーサーは非常に高速ですが、瞬時ではありません。これは視覚効果としてのみ行われ、ゲームプレイには直接影響しませんが、射手、射手に手掛かりを与え、傍観者に銃声への方向性のある参照を与えます。
これらの種類の弾丸物理学を使用するほとんどのゲームは非現実的です。弾薬や弾丸の破片がなく、貫通がある場合は通常線形です。
ARMA II、STALKER(シリーズ全体)などの一部のゲームでは、より現実的な弾丸物理学を使用して、移動時間、跳弾、および偏向角による貫通を実現しています。これらのシステムはレイキャスティングを使用していると思いますが、制限は弾丸の速度によって決まります。これらのゲームでは、銃口の速度はARMA IIのように現実的であるか、STALKERのように見えます。
銃はレーザーではなく発射体を発射するので、私は現実的な弾丸物理学を持つことを大いに好みます。
PlanetSideの弾丸コードを書きました。いくつかの「ヒットスキャン」発射体がありましたが、CPUの制約といつでもプレイできる膨大な数の弾丸を与えることができる限り、発射体をほとんどシミュレートしました。
ヒットスキャンの場合、影響は、多くの場合単一のレイキャストを使用して、入力が受信されるのと同じフレームで決定されます。これは、レーザーやその他の非常に高速の発射体などの武器に適しています。ヒットスキャンは、発射体の初速度を1ティックでゲームボードを横切るほど高くするだけで行いました。
非ヒットスキャンの弾丸は、グラフィックフレーム時間または固定タイムステップのいずれかにチェックマークが付けられ、加速(ロケットを考える)、重力、空気摩擦、誘導(熱を求める発射体を考える)などの計算が適用されます。目標は、タイムステップの発射体の終端位置を生成することです。開始点と終了点が確立されると、1つ以上の光線を投射して飛行経路を近似し、飛行中に発生したであろう衝突を検出できます。
ヒットスキャンと非ヒットスキャンの両方の発射物で、衝突時に何が起こるかは、発射物の特性と衝突する表面に依存します。たとえば、ハードサーフェスにヒットすると、バウンスカウントを確認し、反射ごとに位置と速度を調整するか、最大バウンスカウントに達した場合に発射体を爆発させることができます。このシステムでは、ロケットの最大バウンスカウントは0です。柔らかい表面にぶつかり、貫通力を確認して、発射体がマテリアルを通過するかどうかを判断します。
書くのは楽しいコードでした。また、何が起こっているのかを適切にデバッグするための視覚化を書くことは、飛行経路やイベントなどを視覚的に調べることができるのでとても便利です。
それはゲームと正確さ/リアリズムのレベルに依存します。
マルチプレイヤー設定でのシューティングモデルとダメージモデルの同期は、弾丸がどこでいつ発射されたか、ターゲットに命中したかどうか、パスを通過したものが何かを正確に判断する必要があるため、かなり困難です。
したがって、可能な場合は、ゲームデザイナーはショットを瞬間として扱うことで(時間内に全員の位置のみを考慮する必要があるように)、弾丸の範囲を制限することで物事を単純化すると考えています。幸いなことに、これはしばしば実際の物理学に対応しています。たとえば、スナイパーライフルは高速のラウンドを発射します。
多くのゲームは、低速で移動するオブジェクト(大砲、爆弾、マーカー弾など)のマルチステップマルチスナップショットパスをシミュレートできますが、これは非常にコストがかかり、同期の問題がより一般的で、面白いYouTubeビデオにつながります。
別の懸念は、より大きな空間の錯覚を作成するために、個別の小さな「環境」を維持するゲーム(たとえば、各部屋が個別にシミュレートされる)です。これらの場合、「部屋」の境界内の物は正しくシミュレートされ、部屋の全員が弾丸が作る空間の一連の遷移について更新されますが、その環境以外の人はそうではありません。
それは実装に依存しますが、ソースエンジンは物理的な弾丸(発射体オブジェクト)をまったく使用せず、プレーヤーからターゲットへのレイキャストをランダムな「ヒットゾーン」円で行いました(より大きな半径または小さな半径は武器の発射速度、およびプレイヤーが発射ボタンを押し下げた場合)、その中心がプレイヤーが照準を合わせていたポイントであり、プレイヤーからランダムに決定されたポイントへの実際のレイキャストを決定した後、他の要因(弾丸の「重量」と銃口の速度(すべての内部数値)、オブジェクトのヒットなど)レイキャストは複数のオブジェクトを通して、または地形に到達するまでキャストされました。
反対に、Torque 3D Engine DIDは実際の発射物オブジェクトを使用し、設計者は個々の速度、質量、重力の修飾子に影響を与える可能性があります。エンジンはすべて、32ミリ秒ごとに値を更新しました。
編集
発射物オブジェクトの使用に加えて、Torque 3D Engineは代替手段としてレイキャストの使用も許可しました。(「投射物」が実際にはパーティクルエフェクトであるゲームをいくつか作成しましたが、投射物オブジェクトがサポートしていないため、レイキャストが必要です。)
Team Fortress 2 wikiには、発射物とヒットスキャン武器の動作に関する非常にクールな記事があります。
実際、多くのゲームはGPUレンダリングヒットテストアルゴリズムを使用しています。基本的な仕組みは次のとおりです。
1)オフスクリーンは、すべての地形が黒で、すべての文字が黒以外の色である現在のビューのレンダリングを作成します2)十字線の下のピクセルの色を取得します3)黒以外のルックアップの場合、色- >プレーヤーをマッピングし、そのターゲットにヒットを適用します。
この方法は、ピクセルパーフェクトであるため、ゲームで長年使用されてきました。プレーヤーの帽子の1ピクセルが壁の後ろから突き出ている場合、彼を打つことができます。IEあなたはそれを見ることができれば、あなたはそれを打つことができます。このタイプの精度は、単純なレイキャスティング技術ではほとんど不可能です。次に、この種のテストは非常に高速で、GPUで実行できます。
一部のゲームは、弾丸の移動時間とドロップを考慮して、現実的な弾丸の物理学を使用することは間違いありませんが、少なくともNPCについては、ほとんどのゲームは使用しないと推測しています。
弾丸の直接的な移動(ドロップなし)を瞬時に行うゲームの場合、ゲームはバレルのポイントから前方に架空の線(ベクトル)をトレースします。次に、そのラインが交差するものを計算し、そのポイントで弾丸の「ヒット」を登録します。弾丸がヒットしたデカールや煙/破片の「パフ」など、衝撃がエフェクトを引き起こす壁のような固体オブジェクトである場合があります。破壊可能なオブジェクトに影響を与えて破壊するか、物理オブジェクトに影響して「キック」を与える可能性があります。または、もちろん、プレーヤーまたは別のNPCにヒットし、ヘルスヒットを引き起こす可能性があります。ハードコアシミュレーションは、壁を貫通する弾丸をモデル化し、出口側でヒット効果をトリガーし、おそらく出口での弾丸のダメージを減らします。
NPCが完璧な目的を持っていないように、多くのゲームは弾丸の広がりをモデル化するためにベクターに何らかのランダム化を追加します。これは実際の生活で見られるものであり、弾丸はすべて狙った場所に当たるのではなく、照準スポットを中心としたパターンでヒットします。
弾丸の広がりを視覚化するために、直線(ベクトル)の代わりに銃から出てくる円錐を想像してください。実際の弾丸の方向は、この円錐内のどこかにランダムになります。射手が標的に本当に近い場合、広がりは小さく、精度は高くなります。ターゲットが遠くにある場合、コーンはより大きな広がりを追加するため、射手がターゲットにヒットする可能性は低くなります。
ショットコーンのこのアイデアは、シューティングゲームの精度(スキル)、武器の精度、およびその他の条件をモデル化するために使用できます。たとえば、低レベルのNPCには低精度のショットコーンが与えられますが、熟練したNPCには高レベルの精度があります。短機関銃で腰から射撃して走っているプレイヤーは、ワイドショットコーンを持っているでしょう。スナイパーライフルは、ピストルを言うよりも本質的にタイトなショットコーンを持っているでしょう。
別の戦略は、すべてのレンダリングとすべてのレイトレーシングのハイブリッドです。必ずしもすべての弾丸をレンダリングする必要はありません。たとえば、銃が1秒間に30発発射すると、ストラフは数百のパーティクルを生成する可能性があります。「トレーサー効果」を使用してレンダリングを減らし、3番目のショットごとにレンダリングし、他の2つをレイトレースできます。プレイヤーは敵に10発/秒の砲撃を行うことを引き続き確認します。
特定の状況に合わせて微調整し、発射速度が遅い場合はレンダリングを増やし、発射率が高い場合はレンダリングを減らします。
実際、Call of Dutyでビデオのリプレイを見ると、オレンジ色の二足歩行が空中を意図したターゲットに飛んでいるのをかすかに見ることができます。
ホーボーのようなリッチチェット効果が必要な場合は、Haloゲームをプレイしてください。より近い位置から金属製の壁を撃つと、弾丸が金属から飛び散るのを見ることができます。その中の狙撃兵は、それが命中した場所への道を残します。
遅らせられた回答が終了しました。後で修正するために戻ることができます。
ゲームのストーカーシリーズの箇条書きとすべての物理学では、「Open Dynamics Engine」と呼ばれるオープンソースライブラリを使用します。
http://en.wikipedia.org/wiki/Open_Dynamics_Engine
弾丸は重力で落下し、壁から跳ね返り、非常に正確に弾丸を何かから曲げて、見えないがその位置を知ることができる人を撃つことさえできます。箇条書きは実際のオブジェクトモデルです。これは私が見た中で最も現実的な方法です。レイトレース法は、大きな空間に移動し始めると実用的ではありません。しかし、レーザー銃を撃っても大丈夫でしょう。
BloodRayne 2、Call of Juarez、World of Goo、X-Moto、OpenSimulatorを使用する他のゲーム。
別の良い選択は、物理ライブラリ「弾丸」です。 http://en.wikipedia.org/wiki/Bullet_%28software%29
グランドセフトオート4、レッドデッドリデンプションなどで使用されました。
ps arma 2は社内の物理エンジンを使用し、次のゲームarma 3はphysX物理エンジンを使用します