問題タブ [physics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - WPF: 移動速度 (平行移動) は距離によって変化します
このプログラミングゲームを参考に、現在制作中です。
キャンバスを特定の距離に、現在の角度に従って移動 (変換) する以下のメソッドを作成しました。
受け入れるパラメーターの 1 つは、変換時にカバーする必要があるピクセル数です。
上記のコードに関して、Animator_Body_X
とAnimator_Body_Y
はタイプDoubleAnimation
であり、ロボットのTranslateTransform
オブジェクトに適用されます。Translate_Body
私が直面している問題は、入力された距離に応じて、ロボット (キャンバス) が異なる速度で移動していることです。したがって、距離が長いほど、ロボットは速く動きます! つまり、入力された距離が の20
場合、ロボットの動きはかなり遅くなりますが、入力された距離が の場合、800
文字通り画面から飛び出します。
入力された距離に関係なく、この速度を一定にする必要があります。
Animator_Body_X
入力された距離に応じてとプロパティのいくつかを微調整する必要があると思いますが、Animator_Body_Y
何を正確に微調整すればよいかわかりません (数学も行う必要があると思います)。
これを理解するために見てみたいと思うかもしれないプロパティのリストを次に示します。DoubleAnimation
simulation - グリッドによる水のシミュレーション
しばらくの間、 「ゲームのリアルタイム流体力学」から集めたアルゴリズムを使用して、流れる水のシミュレーションを試みてきました。問題は、これらのアルゴリズムでは水のような動作が得られないように見えることです。
私自身、私は何か間違ったことをしていると思います。これらのアルゴリズムはすべて水のような流体に適しているわけではありません。
これらのアルゴリズムで何が間違っていますか? これらのアルゴリズムはまったく正しいですか?
関連するプロジェクトがbitbucket repositoryにあります。( gletoolsと最新のpygletを実行する必要があります)
wpf - Silverlight で farseer 物理学で作成された RagDoll を操作するにはどうすればよいですか?
このデモのようなラグドールを作りました。この縫いぐるみ人形は、キャラクターがダメージを受ける、死ぬ、落ちるなどのアニメーションに物理学が使用されるターンベースの RPG ゲームに使用されます。
現在考えているのは、縫いぐるみ人形の頭を背景にくっつけて(体はぶら下げたまま)、基本的に体の部分を振り回してパンチなどをシミュレートするかどうかです(図のように)図 1)、または関節を硬直させ、実行したアクションに対して身体の部分を静的に回転および移動させます (図 2 を参照)。キャラクターが死にかけている場合 (または同様のアクション) は、関節を緩めてぼろぼろにするだけです。人形が倒れます。または、これを行うためのより良い方法はありますか?
私は遠見物理学に不慣れで、私が言及したことが可能であるか、それとも圧倒的に難しいかさえわかりません.
イラスト http://img3.imageshack.us/img3/8681/charactermovementrg5.jpg
図中の赤い線はキャラクターの腕を表していることに注意してください
c# - バウンス角を計算する方法は?
しばらく遊んでみましたが、なかなかわかりません。
ミサイルを発射する戦車を作り、ミサイルが壁に当たったら跳ね返らせたいのですが、直角に跳ね返らせたいです。
今のところ障害物はありません。ミサイルはviewportRectangle
私が作ったものの外に出ると跳ね返ります。
私が探している解決策はかなり進んでいますか?
それを行うための比較的簡単な方法はありますか?
math - 剛体の物理学/変換を手伝ってください
ボディがポイントAとポイントBの間をスライドできるようにするスライダーコンストレイントをインスタンス化します。コンストレイントをインスタンス化するために、2つのボディをコンストレイントに割り当てます。この場合、1つのダイナミックボディを静的な世界にコンストレイントします。スライディングドアを考えてください。 。3番目と4番目のパラメーターは、変換、参照フレームAおよび参照フレームBです。変換を作成および操作するために、ライブラリはクォータニオン、行列、オイラー角をサポートしています。
デフォルトのスライダー制約は、ボディをx軸に沿ってスライドさせます。私の質問は 、2つの変換を設定して、ボディBがそれ自体の原点と空間内の追加の点によって指定された軸に沿ってスライドするようにするにはどうすればよいですか?
素朴に私は試しました:
ただし、クォータニオンは期待どおりに機能していないようです。それらについての私の数学的知識はよくないので、誰かがこれがうまくいかない理由について私に記入してくれるなら、私は感謝するでしょう。何が起こるかというと、体はその方向に直交する軸に沿ってスライドします。Quaternionコンストラクターで回転部分を変更すると、ボディはそのスライド方向を中心に回転します。
編集: フレームワークは弾丸物理学です。2つの変換は、各ボディのローカル座標系に関して、スライダージョイントが各ボディにどのように取り付けられるかです。
Edit2 直交基底を介して変換の回転部分を設定することもできますが、その場合、単一のベクトルから直交基底を確実に構築する必要があります。クォータニオンがこれを防ぐことを望みました。
Edit3 私は次の手順でいくつかの限られた成功を収めています:
ただし、GramSchmidtは常にtrafoBマトリックスの一部の軸を反転し、ドアは上下逆または右から左に表示されます。私はこれを解決するためのよりエレガントな方法を望んでいました。 Edit4 解決策を見つけましたが、上部のベクトルがスライド方向と一致している場合、これによって制約ソルバーに特異点が生じるかどうかはわかりません。
optimization - 基本的な物理シミュレーターを最適化するにはどうすればよいですか?
画面上でボールを跳ね返せる単純な物理モデラーを作成しました。クリック アンド ドラッグしてボールを発射したり、一度に数百個のボールを生成して相互に作用する様子を観察したりできます。
取り組むのは楽しい小さなプログラムでした。できればさらに進めたいと思っています。時期尚早の最適化がすべての悪の根源であると彼らが言うことは知っていますが、実際のパフォーマンスの障壁にぶつかり始めています。ゲーム/シミュレーター開発の経験がある人が助けてくれるかどうか知りたいです.
問題:
現時点では、ボールを追加しすぎるとプログラムが停止します (私のマシンでは 800 個を超えるボールを処理できないようです)。実行すると、シミュレーションが現実的ではなくなり、すべてのボールが下部で重なり合ってしまいます。
問題は衝突検出にあります。最も素朴なケースでは、衝突検出は O(N^2) 問題です。各ボールは、他のすべてのボールをチェックします。これにより、すぐにパフォーマンスが低下します (100 個のボールの後でも、ループ サイクルごとに 10,000 の衝突チェックを行うことになります)。
ここを見ると、数百個のボールを追加したスクリーンショットを見ることができます。シミュレーターが追いつかなくなり、お互いに重なり始めます。
現在、重なっているボールを探すことで衝突を検出しています。重なっている 2 つのボールを見つけた場合は、それらを最小移動距離 (MTD) で離すか、押し離します。次に、単純な物理方程式を使用してインパルス ベクトルを調整し、衝突後に異なる方向に進みます。
ボールが多すぎる場合に最小移動距離が顕著になることを除いて、これはうまく機能します。それらは大量に重なり始め、常に底で互いに押し合います。「重力」を増やせば増やすほど悪くなる。それらへの圧力が増加し、それらが互いに圧縮/重なり合う量が増加します。
繰り返しますが、かなりの N 個のボールを打つまで問題はありません。
現在の最適化方法:
衝突検出 -
スイープとプルーニング- (別名、ソートとスイープ)
x軸に沿ってループサイクルごとにボールに挿入ソートを使用します。挿入ソートの性質により、シミュレーターの一時的な一貫性を活用できます。フレームごとに、ボールの位置がわずかに変化するだけなので、並べ替える作業はそれほど多くありません。これにより、線形ソートの償却された実行時間が O(N^2) の平均実行時間ではなく、O(N) または線形になります。
ボールがソートされているので、衝突をチェックする前に、2 番目のループでいくつかの事前チェックを行います。これで、互いに近くにあるボールをチェックするだけで済み (x 軸に沿ってソートされているため)、xmin が現在のボールの xmax より大きい別のボールに対してボールをチェックするたびに、2 番目のループから抜け出します。 . したがって、何千ものチェックをスキップします。
これを実装したところ、速度が大幅に向上しました。それでも600~800球以上は扱えるようにしたいです。10,000 個のオブジェクト間の衝突検出を同時に簡単に処理できる物理エンジンについて読んだことがあります。
プロファイラーを実行したところ、衝突検出に約 55% の時間が費やされ、レンダリングに約 45% の時間が費やされていることがわかりました。したがって、これらは私の 2 つの最も高価なコストです。
質問:
シミュレーターがより多くのボールを処理できるようにするための、より優れたアルゴリズムまたは手法を思いつきますか?
関連コード:
プロジェクト全体:
svn チェックアウトhttp://simucal-projects.googlecode.com/svn/ballbounce/trunk/
または、ここをクリックして、ブラウザでファイルを手動で参照します。
関心のあるセクション:
- Pastebin: checkCollisions() - w/ Sweep と Prune
- Pastebin: resolveCollision() - Sweep と Prune によってまだ削除されていない場合、高価な真の衝突チェックと解決。
- Pastebin: render() - レンダリングだけで約 45% の時間が費やされます。
physics - 量子調和振動子の波動関数と数値積分するにはどうすればよいですか?
被積分関数の 1 つまたは複数の関数が1d 量子調和振動子波動関数である場合の、無限範囲にわたる 1 次元積分の数値積分の実行方法 (数値積分法と使用するトリック) 。とりわけ、調和振動子基底でいくつかの関数の行列要素を計算したい:
phi n (x) = N n H n (x) exp(-x 2 /2)
ここで、H n (x) はエルミート多項式です。V m,n = \int_{-infinity}^{infinity} phi m (x) V(x) phi n (x) dx
また、幅の異なる量子調和波動関数が存在する場合も同様です。
問題は、波動関数 phi n (x) が振動動作をすることです。これはnが大きい場合の問題であり、GSL (GNU Scientific Library) の適応ガウスクロンロッド求積法のようなアルゴリズムは計算に時間がかかり、大きな誤差があります。
java - Javaで弾むボール
これはおそらく本当に基本的な問題ですが、それに関する他の記事が見つからないようです。
とにかく、私はJavaで小さな跳ねるボールプログラムを書いて、私の基本的なスキルを広げようとしました. このプログラムは、落下してしばらくの間跳ね返る単純な弾むボールです。元のプログラムは問題なく動作しましたが、プログラムに重力を追加しようとしました。重力は実際にはしばらくの間うまく機能しますが、バウンスが非常に小さくなると、アニメーションが非常に短時間不安定になり、ボールの位置が絶えず減少します. 私は問題を理解しようとしましたが、私はそれを見ることができません。どんな助けでも大歓迎です。
}
編集: 不規則な動きを整理したようです。ボールがバウンドしなくなったときに、ボールが下に移動するのをどのように止めることができるか、まだ苦労しています。現時点では、バウンスを停止し、「床」を通過して下に移動し続けます。yspeed += 重力線に関係していると思います。動きを止める方法がわかりません。
simulation - Box2D 物理エンジンを使用して、線路上の列車を上から見たままにするにはどうすればよいでしょうか?
Box2D のような物理ライブラリを使用して、線路をたどる列車の上面図やスイッチなどをモデル化するのは楽しいと思います。これを機能させるには、どのジョイントとモーターが必要ですか?
車がスプライン トラックをたどるのに必要な力を実装して、他の電車の車、歩行者、デロリアンなどに衝突できるようにする方法に興味があります。時間ステップごとに「車は現在スプライン(t)にある」と言うだけです。物理エンジンに過剰な力が発生します。私の理解が正しければ、車を 1 つの力でトラックに貼り付け、別の力でトラックと平行になるようにその角度を制限します (または、車の前後を 2 つの力でトラックに貼り付けます)。列車を前進させる別の力。これらのことを達成する方法の詳細を探しています。
simulation - 2D サーフェス上で移動して回転するディスクの摩擦抗力はどのように計算できますか?
摩擦 u も含まれる表面上の質量 m と半径 R の円盤を考えてみましょう。この円盤にある方向に開始速度 v を与えると、円盤はその方向に向かって進み、減速して停止します。
ディスクが速度の横に回転 (または表面に垂直な回転線で回転) w している場合、ディスクは線上を移動せず、代わりに曲がります。直線速度と角速度の両方が最後に 0 になります。
このバンディング/カーブ/ドラッグはどのように計算できますか? X(v,w,t) 関数の解析解を与えることは可能ですか?ここで、X は、特定の t での初期 vw に従ってディスクの位置を示しますか?
シミュレーションのヒントも問題ありません。w と m と u に応じて、線形速度に垂直な追加の速度が発生するため、ディスクのパスは線形パスから曲がると思います。