物理演算エンジンってどうやって作るの?
■ このスレッドは過去ログ倉庫に格納されています
ハーフライフとか、オブリビオンのあれです。
詳しい人教えて
振動を抑えるためいろいろやってたら非物理エンジンになってた件について
やっぱ難しいわ 振動を抑えるのはタイムスライスを細かくして見えない幅にするくらいか 物理演算興味持って1から趣味で作り始めたんだけど
これってやっぱ物理学関係ない所で詰まりがちやねw 剛体の力学の本を買ってきて理解する。
あとは、これを読めばおk。今の剛体の処理で主流の奴
http://www.pixar.com/companyinfo/research/pbm2001/pdf/notesg.pdf
最終的に、線形相補性問題を解くことになる。これをいかに効率よく解くかが鍵。
昔やったときは、前フレームの情報を利用して効率化したけど、それでも全然遅い。 てゆうか >>25 に書いてるな。
コンストレイントソルバーっていうのが線形相補性問題を解くっていうこと。
ODEは基本>>52の論文の方法。
ODEには処理速度で互角か勝てるぐらいまでいける。でも、それ以上のフリーじゃないやつはムリポ。
剛体が300個とかになってくると、線形相補性問題の行列の情報がキャッシュに乗り切らないから、そこがボトルネックになる。
対称行列になるからとか工夫してもムリポ
実家にdelphiだけどソースコードあるはずだから、需要あるなら公開しよっかな。 >>56
ありがとう
つい最近OpenGLに手をだしてやっとモデルデータを表示できるとこまで来たんだけど
それを動かすとっかかりになればなーと 参考にさせてもらいます! >>57
待てよ。そのレベルだと参考にならないぞ
数学はどの程度知ってるの >>58
工業系の大学数学レベルまでならしったかぶり出来る程度には・・・
とにかく右も左も分からなくて情報をかき集めてる段階です >>59
数学が大丈夫なら、>>52に全部書いてると思う 物理エンジンの作り方って需要あるの?
ガチの本とか書いたら売れるのかな? >>62
本書いたら買ってくれる?
表紙に萌え萌えな絵付ければ売れるかな
でも、面倒だから。お金目的じゃなくて、純粋な自己顕示欲で書くかもwww
http://haihu.zouri.jp/ 既存の物理エンジンだけで飽和状態なので需要はないに等しい。使い方の方が圧倒的に需要あると思う。 そうなのかよ。
原理から知りたいっていう熱心な若者はいないのか? ○○というゲームの○○の動きをプログラムで再現してみよう
みたいなのはうけるんじゃない 本にはできなさそうだけど 昔、本買って自作したけど、独立した物体同士の相互作用までは
出来たけど関節(拘束)のやり方が載ってなくて挫折した。
なのでそこんとこ頼むわ>本書く人 関節のほうが計算量少ないから、簡単だぞ
なんで、できなかったんだ? >関節のほうが計算量少ない
え?え?(^ω^;)
ググってもよー判らんわ。関節。 それって、(本に記載されているロジック通りに組んだら)出来た
って事? 関節は、連立一次方程式になるから、計算量最悪は n * n * nで解ける。
普通の接触は、線形相補性問題になるから、計算量は最悪、2^n。
実際は反復法でやるから、ここからだいぶ減らしていくんだけど。
減らしていっても、関節のほうが圧倒的に計算量が少ない 俺が買った本、
「ゲーム開発のための物理シミュレーション入門」って奴なんだけど、
まず、
>普通の接触は、線形相補性問題になるから
ここがすっぽ抜けてる希ガス。
なので接触したらいい具合に押し戻すって感じ。ダメだこりゃ。 >>52のpdfを検索したけどLCPとかcomplementary等の単語がみつからなかったけど、
そのへんものってるでしょうか?>読んだ人 >>74
俺は実は読んでないwww今読んだら、quadratic programって書いてある。同じことだと思う
ページG53に、そのことが書いてあって。関節も一緒に扱えるみたいなことが書いてある
需要あるのか? 剛体シミュレーションの処理時間のほとんどは、線形相補性問題に裂かれるから
その速い解き方を考えれば有名になれるはず
剛体特有の性質を使わないと速くならないから、剛体の接触から得られる行列がどういう性質を持っているか考えるのが重要 みんな言語何使ってるの?
勉強用のやつ作ってみようと思ってるけど、C#とかDelphiとか読めるの?
C++は使いたくないお http://www.ynl.t.u-tokyo.ac.jp/publications/pdf2007/oral07/20.pdf
これのピボット法じゃなくて、ガウスザイデルに近いやり方でやってた。
収束が保障されてないってかかれてるけど、剛体に関して言えば全体のエネルギーみたいなものに着目すれば
各ステップごとに確実に減少していくから収束はするんじゃないかなって思ってる。
lemke法は知らない。今調べてる JavaかC#ならいいんでない?
ちっと重いかもだが lemke法、本当に収束するのかとか、どのくらいで収束するのかとか理解してないけど。少し理解した
剛体が増えると不利だな。元々の疎行列が活かしづらい
マルチグリッドLCPが出来れば超速くなるはず BulletXのソース読んでみたけど、あれって拘束ベースなのかな?力積ベースなのかな?
constraint(拘束)Solverっていうディレクトリが在ったから読んでたら、Impulse(力積)を加えてたんで判んなくなった。
拘束ベースの判り易いソースって知ってたら教えて欲しいな。VC++よりはC#の方が読み易いからうれしい。 拘束条件を解く方式のエンジンでも、拘束されてる(物体どうしが一定時間以上
連続して接触している)ときも常に力積を加え続ける方式のものもあるよ。
つまり、力積が吊り合ってたら物体が静止状態になるってことね。
ちなみに、ソース読むよりも代数学の行列とか勉強した方が早いかも。
連立方程式を反復法で適当に解いてくエンジンとか、
すごい高度な数学のテクニックで解いてくエンジンとかいろいろある。
まずそっちの知識が無いと、ソースだけ読んでもわけわからん。 >>82
俺が教えてやるよ。もちろん数学はできるんだよな?
・ペナルティ法
・撃力
・拘束 撃力について
衝突したら撃力を加えるっていうのを何度もやる。
静止状態も実は撃力を何度も加えて結果的に静止してる
これは静止状態が重いんだわ だから、それに加えて力積 or 力に関してのLCP(線形相補性問題)を解く
これはどういう式かっていうと
普通静止させたい場合は、衝突部分の相対速度の法線成分が0になるっていう式を連立させて解けばいいよな?
でも、離れようとしてるのに力を加えたり、マイナスの力を加えるのはおかしいよな?
だから
力 >= 0、相対速度 >= 0、力 = 0 or 相対速度 = 0
っていう式を立てるのよ
どっちかがゼロでなければもう片方はゼロっていう
これを高速に解くのがキモなの おおまかな流れとして
・撃力を加える(静止状態とかだとかなりの回数になるから、どこかで打ち止め(近似))
・重力とかの外力を加える
・LCPを解く
速度と加速度を別に保持しておくか、速度だけにするか
つまりLCPで解く対象を速度にするか、加速度にするか
撃力を打ちどめることが多いので、近似になるけど速度をLCPで押さえこんだほうがいい。撃力を打ち止めてほっておくとめり込む
LCPで解く対象は速度だから、外力を加えるときは、dtをかけて力積として加えてしまう ペナルティ法
めり込みに応じて反発力を。めり込んだ体積に比例させたり、距離に比例させたり
ステップ数が十分短ければどれも正しいんだけど、ステップ数が広いときにどれがいいのか
って分からない
ステップ数を広くできないから、他の方法と比べて衝突判定のコストが上がってしまう >>82-88
レスありがとうございます。>>82です。
物理エンジン関係の資料はいくつか読んで、物理・数学関係は断片的な知識としてはあります。
それをプログラムに実装するにはどうしたらいいか判らなくてソース読んでました。
>>82を書き込んだ後、拘束ベースに関しては以下の本読んで勉強してました。
http://www.amazon.co.jp/Physics-Based-Animation-Graphics-Jon-Sporring/dp/1584503807
この辺りまでは、判りました。
>>普通静止させたい場合は、衝突部分の相対速度の法線成分が0になるっていう式を連立させて解けばいいよな?
LCPの解き方がキモなのですね。次は、LCPの辺り重点的に読んでみます。 ソルバも重要だけど、もちろん衝突検出の幾何学の部分も重要だよ。
そこがてきとーすぎると、やっぱり細かいとこで変な挙動になったり
誤差がふりつもってガクガクしたりするからね。 衝突検出に関しては、以下の本を1/3程度読みました。
「ゲームプログラミングのためのリアルタイム衝突判定」
時間さえ掛ければ自分のプログラムに応用できそうですし、挙動を見ながらの方が理解が早いと思っています。
初心者の自分には今時点では、目途の立っていない運動方程式の方に意識が行っています。 衝突判定なんてLCPに比べればカスみたいなもの
適当やってればいい
Rapidだか、Opcodeとか参考にすれば?
普通にAABBTreeかOBBTreeでやるのが楽だな
運動方程式理解できないとか勉強足りないぞ。
オイラーのなんたらってやつやろ?
あとあの方程式は非線形だけどエネルギーを保存するやり方で差分化できる
ちょっと考えるとな 自分の作るプログラム上で予想どおりに動かなかった場合には、衝突判定も深く勉強しようと思います。
形状も最初は球や直方体やシリンダーといった単純な形状で考えて、シミュレーション出来たら種類を増やしていこうと思います。
自分のレベルではまだ複雑な事までチャレンジできるかんじでは無いので。
opecodeですか、ソースありそうですしダウンロードして見てみます。ありがとうございます。 >>94
おいおい、最初はまず任意の多面体でやれよ
シリンダー専用衝突判定なんていうは高速化のためな
多面体でシリンダー作ればいいんだから。AABBTreeとかにすれば面の数に対して処理時間はそんなに増えない
opecodeソース読んでも分からないと思う。まあ、デモ動かしてみて計算速度の目安にするとか
解説読むとか >>93
やっかいだけど、現実的な解決方法はちゃんとある。 >94
判定方法にもよるけど、球とかシリンダーとかの曲面を含むようなのは
面倒だから後回しで、最初は頂点と辺(直線)と面だけで作れる多面体だけでいいよ。
なんとかツリーとかの判定の高速化も後回しでOK。 新しい剛体シミュの方法思いついた
もう少し練ってデモ作る
撃力でも拘束ベースでもペナルティ法でも無い奴 簡単にお金が稼げる方法興味ある人だけ見てください。
グーグル検索⇒『来島のモノノリウエ』
UO82Y8FR9Z ■ このスレッドは過去ログ倉庫に格納されています