タグ付けされた質問 「physics」

空間と時間を介したオブジェクトの動きに関連します。加速(推力と重力)、質量、衝突応答、摩擦などの概念を含みます。

11
いつ固定または可変の時間ステップを使用する必要がありますか?
ゲームループは固定または可変の時間ステップに基づいている必要がありますか?常に優れているのですか、それとも正しい選択はゲームによって異なりますか? 可変時間ステップ 物理の更新には「最後の更新からの経過時間」引数が渡されるため、フレームレートに依存します。これは、計算を行うことを意味する場合がありposition += distancePerSecond * timeElapsedます。 長所:スムーズで、コーディングが簡単 短所:非決定的で、非常に小さいまたは大きなステップで予測できない deWiTTERSの例: while( game_is_running ) { prev_frame_tick = curr_frame_tick; curr_frame_tick = GetTickCount(); update( curr_frame_tick - prev_frame_tick ); render(); } 固定タイムステップ 更新は、各更新が一定期間のものであると想定するため、「経過時間」を受け入れない場合もあります。計算はとして行うことができますposition += distancePerUpdate。この例には、レンダリング中の補間が含まれています。 長所:予測可能、決定論的(ネットワーク同期が容易?)、より明確な計算コード 短所:v-syncを監視するために同期されない(補間しない限りグラフィックが不安定になる)、最大フレームレートが制限される(補間しない限り)、フレームワーク内で動作しにくい可変時間ステップ(PygletやFlixelなど)を想定 deWiTTERSの例: while( game_is_running ) { while( GetTickCount() > next_game_tick ) { update(); next_game_tick += SKIP_TICKS; } interpolation …

3
ダイナミックウェーブで2D水を作成するにはどうすればよいですか?
新しいスーパーマリオブラザーズには本当にクールな2D水がありますので、作成方法を学びたいです。 これを示すビデオがあります。例示的な部分: 水に当たるものは波を作ります。また、一定の「背景」波もあります。カメラが動いていないビデオの00:50直後の一定の波をよく見ることができます。 このチュートリアルの最初の部分のように、スプラッシュ効果が機能すると仮定します。 ただし、NSMBでは、水も表面に一定の波を持ち、水しぶきは非常に異なって見えます。もう1つの違いは、チュートリアルでは、スプラッシュを作成すると、最初にスプラッシュの起点で水に深い「穴」が作成されることです。新しいスーパーマリオブラザーズでは、この穴は存在しないか、はるかに小さくなっています。私は、プレイヤーが水に飛び込んだり飛び出したときに生じる水しぶきについて言及しています。 一定の波と水しぶきで水面を作成するにはどうすればよいですか? XNAでプログラミングしています。私は自分でこれを試しましたが、背景の正弦波を動的な波とうまく連携させることはできませんでした。 私はNew Super Mario Brosの開発者がこれを正確にどのように行ったかを尋ねているのではなく、そのような効果を再現する方法に興味があるだけです。

5
優れた2Dプラットフォーマー物理学[終了]
Box2Dで2Dプラットフォーマー用にセットアップされた基本的なキャラクターコントローラーがあり、気分を良くするために微調整を始めています。物理エンジンには微調整するための多くのノブがあり、物理エンジンで初めて書くのは私にはわかりません。ジャンプはいくつかのティックに力を加える必要がありますか?衝動?速度を直接設定しますか?アバターをすべての摩擦を取り除くことなく壁にくっつかないようにするにはどうすればよいですか(または、すべての摩擦を取り除きますが、空中でのみ)。カプセルとしてキャラクターをモデル化する必要がありますか?角の丸い箱?車輪が2つある箱?ただ一つの大きな車輪?誰かが前にこれをやったに違いないように感じます! 「赤ちゃんの最初の物理学」ではないウェブ上で利用可能なリソースは非常に少ないようです。これらはすべて、誰かがすでに問題を解決したいと思っている場所で途切れています。プラットフォーマー用の物理エンジンのほとんどの例には、浮遊感のあるコントロール、空中ジャンプ、または一時的な侵入が高すぎる場合の容易に悪用可能な動作などがあります。 私が意味するいくつかの例: ジャンプの短いタップは短い距離をジャンプします。長いタップは高くジャンプします。 高速で方向を停止または反転するときの短い横滑り。 傾斜の上に安定して立っている(ただし、ダッキングするときに傾斜を下る)。 アナログコントローラーを使用する場合のアナログ速度。 良いプラットフォーマーと悪いプラットフォーマーを区別する他のすべてのこと。 安定した移動プラットフォームをお勧めしますか? 「ほら、これをやる」を本当に探しているのではありません。明らかに、正しいことはゲームで何をしたいかによって異なります。しかし、誰かが可能性を経験して、「テクニックAはXをうまく機能し、テクニックBはYをうまく機能させるが、それはCでは機能しない」、または「if(key = =スペース)character.impulse(0、1) "
76 box2d  physics  input 

7
2D Platformer AABBの衝突問題
AABBの衝突解決に問題があります。 最初にX軸を解決し、次にY軸を解決して、AABB交差を解決します。これは、このバグを防ぐために行われます:http : //i.stack.imgur.com/NLg4j.png 現在のメソッドは、オブジェクトがプレーヤーに移動し、プレーヤーを水平方向に押す必要がある場合に正常に機能します。.gifでわかるように、水平スパイクはプレーヤーを正しく押します。 ただし、垂直スパイクがプレーヤーに移動しても、X軸が最初に解決されます。これにより、「スパイクをリフトとして使用する」ことができなくなります。 プレーヤーが垂直スパイクに移動すると(重力の影響を受けて落下します)、最初はX軸にオーバーラップがなかったため、Y軸に押し込まれます。 私が試したのは、このリンクの最初の回答で説明した方法でした:2D長方形オブジェクト衝突検出 ただし、スパイクと移動オブジェクトは、速度ではなく位置を変更することで移動します。Update()メソッドが呼び出されるまで、次の予測位置を計算しません。言うまでもなく、このソリューションも機能しませんでした。:( 上記の両方のケースが意図したとおりに機能するように、AABBの衝突を解決する必要があります。 これは私の現在の衝突ソースコードです:http : //pastebin.com/MiCi3nA1 このバグは最初からずっとエンジンに存在していたので、誰かがこれを調べることができれば本当に感謝しています。これは真剣に衝突コードを見て夜を過ごし、「楽しい部分」に到達してゲームロジックをコーディングするのを妨げています:( XNA AppHubプラットフォーマーデモと同じ衝突システムを実装しようとしました(ほとんどのものをコピーアンドペーストします)。ただし、私のゲームでは「ジャンプ」バグが発生しますが、AppHubデモでは発生しません。[ジャンプバグ:http : //i.stack.imgur.com/NLg4j.png ] ジャンプするには、プレーヤーが「onGround」であるかどうかを確認し、Velocity.Yに-5を追加します。 プレーヤーのVelocity.XはVelocity.Yよりも高いため(図の4番目のパネルを参照)、onGroundは本来あるべきではないときにtrueに設定され、プレーヤーを空中でジャンプさせます。 プレーヤーのVelocity.XがVelocity.Yよりも高くなることはないので、AppHubデモではこれは起こらないと思いますが、間違っている可能性があります。 これを解決する前に、まずX軸で解決し、次にY軸で解決しました。しかし、それは私が上で述べたようにスパイクとの衝突を台無しにします。

3
船を回転させるためにオンにするスラスタを決定する方法は?
船の構成は動的に変化するため、船を時計回りまたは反時計回りに回転させたいときに、どのスラスタをオンにするかを決定する必要があります。スラスタは常に船と軸が揃っており(角度を付けない)、オンまたはオフです。可能なセットアップの1つを次に示します。 これまでに試したことは、発砲ベクトルと船の重心への方向ベクトルを視覚化することです。 残念ながら、私はそれでそれほど遠くに行きませんでした。


2
キャラクターをジャンプさせる方法は?
現在、Direct X 9.0を使用してC#でゲームを作成しています。ゲームのリメイクはドンキーコングNESです。私はほぼすべてを完了しましたが、マリオのジャンプの物理学に問題があります。YとXの調整用に宣言された変数があります。 これを行う簡単な方法があるかどうか疑問に思っていました。高いものと低いもので答えを探しましたが、見つかった答えは無関係であるか、XNAなどの別のプログラミング言語を使用しています。 現在、Wが押されたかどうかを確認するためにbool変数が設定されており、Wが押されると、コードをトリガーしてジャンプさせます。などをいじっています。 if (jump == true) { Playerypos -= vel; Playerxpos += vel; } うまくいきませんでした。私は答えを求めて高低を検索しましたが、今は誰かが簡単な解決策の正しい方向に私を向けることができれば、私は必死です。それは素晴らしいことです。どんな反応にも感謝します。
44 physics  input  jumping 

8
決定論的な物理シミュレーションを実行するにはどうすればよいですか?
私は、プレイヤーがパズルやマップを解くためにピースやパーツを動かす剛体を含む物理ゲームを作成しています。ゲームの非常に重要な側面は、プレイヤーがシミュレーションを開始すると、オペレーティングシステム、プロセッサなどに関係なく、どこでも同じように実行されることです。 多くの複雑さの余地があり、シミュレーションが長時間実行される可能性があるため、物理エンジンがその浮動小数点演算に関して完全に決定的であることが重要です。別の「失敗」。 ゲームでこの決定論を実現するにはどうすればよいですか?Javascript、C ++、Java、Python、C#など、さまざまなフレームワークと言語を使用したいと思っています。 Box2D(C ++)と他の言語の同等物に惹かれましたが、それは私のニーズを満たすようですが、特に三角関数の場合、浮動小数点の決定論に欠けています。 私が今まで見た中で最良の選択肢は、Box2DのJava同等物(JBox2D)です。多くの操作でStrictMathはなく浮動小数点の決定論を試みているMathようですが、ゲームをまだ作成していないので、このエンジンが必要なすべてを保証するかどうかは不明です。 ニーズに合わせて既存のエンジンを使用または変更することはできますか?または、自分でエンジンを構築する必要がありますか? 編集:誰かがそのような精度を必要とする理由を気にしない場合は、この投稿の残りをスキップしてください。コメントと回答の個人は、私がすべきでないことを求めていると信じているようです。そのため、ゲームがどのように機能するかについてさらに説明します。 プレーヤーには、障害物と目標が含まれるパズルまたはレベルが与えられます。最初は、シミュレーションは実行されていません。その後、提供されたピースまたはツールを使用してマシンを構築できます。スタートを押すと、シミュレーションが開始され、マシンを編集できなくなります。マシンがマップを解決した場合、プレイヤーはレベルをクリアしています。それ以外の場合は、停止ボタンを押してマシンを変更し、再試行する必要があります。 すべてを決定論的にする必要がある理由は、各ピースの位置、サイズ、回転を記録することにより、すべてのマシン(レベルを解決しようとするピースとツールのセット)をxmlファイルまたはjsonファイルにマッピングするコードを作成するためです。その後、プレイヤーはソルブ(これらのファイルで表されます)を共有して、ソルブの検証、相互の学習、競技会の開催、コラボレーションなどを行えるようになります。もちろん、ほとんどのソルブ、特にシンプルまたはクイック決定論の欠如の影響を受けません。しかし、本当に難しいレベルを解決する低速または複雑な設計は、おそらく最も興味深いものであり、共有する価値があると思われる設計です。

6
マリオゲームの物理の分析[終了]
ここでソニック・ザ・ヘッジホッグの物理学の故障があることを知っていますが、マリオのゲームの故障が存在するのではないかと思いました。これに似ているが、マリオが私が興味を持っているものです!
42 physics 

2
水/海のシミュレーションと物理学
水のシミュレーションに関する参考資料と、それが体(ボート、船、潜水艦など)との相互作用をモデル化する方法を探しています。 私は水の視覚的側面(波、反射など)に関する多くの参考文献を見つけましたが、身体との相互作用の仕方をどう扱うかについてはほとんどありません。ゲーム開発での私の経験は非常に限られており、私は本当にここで立ち往生しています。 基本的には、波に応じて船の位置を変化させたいと思います。これどうやってするの? 私はPanda3Dを使用していますが、利用可能な技術で使用されている技術と実装について聞いてみたいです。
42 physics 


2
ゲーム物理学でピタゴラスの定理を使用するのはなぜですか?
私は最近、ピタゴラスの定理を物理計算で多く使用していることを学びましたが、私は本当に意味が分からないのではないかと心配しています。 これは、オブジェクトが水平面内の定数よりも速く移動しないようにするための本の例MAXIMUM_VELOCITYです。 MAXIMUM_VELOCITY = <any number>; SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; function animate(){ var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity); if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){ scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY; x_velocity = x_velocity / scalar; z_velocity = x_velocity / scalar; } } これをいくつかの数字で試してみましょう。 オブジェクトがxで5ユニット、zで5ユニットを移動しようとしています。合計で5ユニットしか移動できないはずです! MAXIMUM_VELOCITY = 5; …

7
浮動小数点の精度と、なぜそれを使用するのか
浮動小数点は、大きな世界での正確さのために常に面倒でした。 この記事では、舞台裏について説明し、明らかな代替手段である固定小数点数を提供します。次のようないくつかの事実は本当に印象的です: 「64ビットの精度で、太陽からPl王星までの最も遠い距離(74億km)にサブマイクロメートルの精度で到達できます。」 サブマイクロメートルの精度は、fpsが必要とする(位置や速度でさえ)必要以上のものであり、本当に大きな世界を構築することができます。 私の質問は、固定小数点にそのような利点があるのに、なぜ浮動小数点を使用するのですか?ほとんどのレンダリングAPIと物理ライブラリは浮動小数点を使用します(そして、その欠点に苦しむため、開発者はそれらを回避する必要があります)。 彼らはとても遅いですか? また、アウターラやインフィニティなどのスケーラブルな惑星エンジンは、大規模をどのように処理すると思いますか?位置に固定小数点を使用していますか、それとも空間分割アルゴリズムがありますか?
38 graphics  physics 

4
非シューティングゲームの動きの予測
私は、中規模のマルチプレイヤー、約20〜30人のプレイヤーが一度に永続サーバーに接続する等尺性2Dゲームに取り組んでいます。適切な動き予測の実装を適切に行うのに苦労しました。 物理学/運動 このゲームには真の物理学の実装はありませんが、基本原理を使用して動きを実装します。入力を継続的にポーリングするのではなく、プレーヤーが制御しているキャラクターエンティティの状態を変更するために、状態の変更(つまり、マウスのダウン/アップ/移動イベント)が使用されます。プレイヤーの方向(つまり、北東)は一定の速度と組み合わされ、エンティティの速度である真の3Dベクトルに変換されます。 メインゲームループでは、「更新」が「描画」の前に呼び出されます。更新ロジックは、速度がゼロ以外のすべてのエンティティを追跡する「物理更新タスク」をトリガーし、非常に基本的な統合を使用してエンティティの位置を変更します。例:entity.Position + = entity.Velocity.Scale(ElapsedTime.Seconds)(ここで、「Seconds」は浮動小数点値ですが、ミリ秒の整数値に対して同じアプローチが機能します)。 重要な点は、動きに補間が使用されていないことです-初歩的な物理エンジンには「前の状態」または「現在の状態」という概念はなく、位置と速度のみがあります。 状態変更および更新パケット プレイヤーが制御しているキャラクターエンティティの速度が変化すると、エンティティのアクションタイプ(スタンド、ウォーク、ラン)、方向(北東)、および現在位置を含む「アバターの移動」パケットがサーバーに送信されます。これは、3D一人称ゲームの仕組みとは異なります。3Dゲームでは、プレイヤーが動き回るにつれて、速度(方向)がフレームごとに変化します。すべての状態変更を送信すると、フレームごとにパケットが効率的に送信され、コストがかかりすぎます。代わりに、3Dゲームは状態の変化を無視し、一定の間隔(たとえば80〜150ミリ秒ごと)で「状態更新」パケットを送信するようです。 私のゲームでは速度と方向の更新の頻度がはるかに低いため、すべての状態変更を送信する必要はありません。すべての物理シミュレーションは同じ速度で行われ、確定的ですが、レイテンシは依然として問題です。そのため、通常の位置更新パケット(3Dゲームに似ています)を送信しますが、頻度はずっと低くなります-現在は250ミリ秒ごとですが、良い予測では500ミリ秒に簡単にブーストできると思います。最大の問題は、私が現在標準から逸脱していることです。他のすべてのドキュメント、ガイド、およびサンプルはオンラインで定期的に更新を送信し、2つの状態間を補間します。それは私のアーキテクチャと互換性がないようで、(非常に基本的な)「ネットワーク化された物理」アーキテクチャに近い、より良い動き予測アルゴリズムを考え出す必要があります。 サーバーはパケットを受信し、スクリプトに基づいてその移動タイプからプレーヤーの速度を決定します(プレーヤーは実行できますか?プレーヤーの実行速度を取得します)。速度が得られると、それを方向と組み合わせてベクトル(エンティティの速度)を取得します。いくつかのチート検出と基本的な検証が行われ、サーバー側のエンティティが現在の速度、方向、および位置で更新されます。基本的な調整も実行され、プレイヤーが移動要求でサーバーをあふれさせるのを防ぎます。 自身のエンティティを更新した後、サーバーは範囲内の他のすべてのプレーヤーに「アバター位置更新」パケットをブロードキャストします。位置更新パケットは、リモートクライアントのクライアント側の物理シミュレーション(ワールドステート)を更新し、予測と遅延補正を実行するために使用されます。 予測とラグ補償 前述のように、クライアントは自分の立場に対して権威があります。不正行為や異常の場合を除き、クライアントのアバターはサーバーによって再配置されることはありません。クライアントのアバターには外挿(「今すぐ移動して後で修正」)は必要ありません-プレイヤーが見るものは正しいです。ただし、移動しているすべてのリモートエンティティには、何らかの外挿または内挿が必要です。クライアントのローカルシミュレーション/物理エンジン内では、何らかの予測および/または遅延補償が明らかに必要です。 問題点 私はさまざまなアルゴリズムに苦労してきましたが、いくつかの質問と問題があります。 外挿、内挿、またはその両方を行う必要がありますか?私の「直感」は、速度に基づいた純粋な外挿を使用する必要があるということです。状態の変化はクライアントによって受信され、クライアントは遅延を補正する「予測された」速度を計算し、通常の物理システムが残りを行います。ただし、他のすべてのサンプルコードや記事とは相反するように感じられます。これらはすべて、多くの状態を格納し、物理エンジンなしで補間を実行するようです。 パケットが到着したとき、パケットの位置を、一定時間(たとえば200ms)にわたってパケットの速度で補間しようとしました。次に、補間された位置と現在の「エラー」位置の差を取り、新しいベクトルを計算して、送信された速度ではなくエンティティに配置します。ただし、別のパケットがその時間間隔で到着するという前提があり、次のパケットがいつ到着するかを「推測」することは非常に困難です。特に、すべてのパケットが一定の間隔で到着するわけではないためです。概念に根本的な欠陥があるのか​​、それとも正しいのか、いくつかの修正/調整が必要なのか? リモートプレーヤーが停止するとどうなりますか?エンティティをすぐに停止できますが、再び移動するまで「間違った」スポットに配置されます。ベクトルを推定するか、補間しようとすると、以前の状態を保存しないため問題が発生します。物理エンジンには「位置Xに到達した後に停止する必要がある」と言う方法がありません。速度を理解するだけで、それ以上複雑なことはありません。「パケット移動状態」情報をエンティティまたは物理エンジンに追加するのは嫌です。これは、基本的な設計原理に違反し、ゲームエンジン全体でネットワークコードを流出させるためです。 エンティティが衝突するとどうなりますか?3つのシナリオがあります-制御プレイヤーがローカルで衝突する、2つのエンティティが位置更新中にサーバーで衝突する、またはリモートエンティティ更新がローカルクライアントで衝突します。すべての場合において、衝突の処理方法は不確かです-不正行為は別として、両方の状態は「正しい」が、異なる期間にあります。リモートエンティティの場合、壁を歩いて描くのは理にかなっていないので、ローカルクライアントで衝突検出を実行し、「停止」させます。上記のポイント#2に基づいて、エンティティを「壁を通り抜けて」継続的に移動しようとする「修正されたベクトル」を計算することがあります。ポジション。ゲームはこれをどのように回避しますか?

2
2Dスプライトの回転力の計算
誰かが次のシナリオを計算するエレガントな方法を持っているかどうか疑問に思っています。 私は(n)個の正方形、ランダムな形状のオブジェクトを持っていますが、それらはすべて長方形のふりをします。 私たちは重力を扱っていないので、空間内のオブジェクトをトップダウンの観点から検討します。下の図のように、特定の正方形のオブジェクトに力を加えています。 適用されている場所で、適用されている力に基づいて回転角度を計算する方法を教えてください。中央の正方形に適用すると、まっすぐになります。中心からさらに移動すると、どのように動作しますか?回転速度の計算方法は?
35 2d  rotation  physics  vector 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.