以前に「物理エンジンは夢を見る」とブログにも書いた覚えがあるのですが、この感覚がなかなか面白く好きです。
(マウスで各頂点をドラッグすると移動できます)
(マウスで各頂点をドラッグすると移動できます)
★遊び方★
・ブランコのように加速するのを確かめよう。
・三角形をバウンドさせた時の変形を確認しよう。
・紐を持って振り回してみよう。
・二重振り子はどう動くか確認しよう。
・壁に押し付けてパッと放すと何処まで飛ぶか確認しよう。
・紐を持ってクレーン遊びをしてみよう。
・三角形の頂点を持って倒立バランスをとってみよう。
・ブランコのように加速するのを確かめよう。
・三角形をバウンドさせた時の変形を確認しよう。
・紐を持って振り回してみよう。
・二重振り子はどう動くか確認しよう。
・壁に押し付けてパッと放すと何処まで飛ぶか確認しよう。
・紐を持ってクレーン遊びをしてみよう。
・三角形の頂点を持って倒立バランスをとってみよう。
CGの世界では現実を写真に撮ったような綺麗な画像(基本は静止画)を作ろうとする方向と、見た目より動きを現実のようにシミュレートする二極があると思います。
もちろん、この二つの目的にはより現実に忠実な世界を作り出そうとする試みなので、これらを組み合わせて映画やゲームのCGが作られています。
ただ現時点ではどちらも大したことが無いというのが正直なところです。
まー難しい話はオタクの方にまかせて、簡単に楽しく遊びましょうというのが今回のテーマです。
もちろん、この二つの目的にはより現実に忠実な世界を作り出そうとする試みなので、これらを組み合わせて映画やゲームのCGが作られています。
ただ現時点ではどちらも大したことが無いというのが正直なところです。
まー難しい話はオタクの方にまかせて、簡単に楽しく遊びましょうというのが今回のテーマです。
物理エンジンと大層なタイトルですが、やっていることは質点をバネのダンパーで接続し、重力加速だけで与えてシミュレーションしているだけです。
Flashレベルでは本格的なシミュレーションを行うには不可能ですが、この程度で十分遊べます。
Flashレベルでは本格的なシミュレーションを行うには不可能ですが、この程度で十分遊べます。
まず質点ですが、言葉は難しそうですが実は簡単。単に運動ベクトルを持っている頂点です。
内容的には現在の座標値と移動ベクトルだけです。
内容的には現在の座標値と移動ベクトルだけです。
これをバネのダンパーで接続するのですが、これも単純です。
まず各頂点の接続マップを用意し、その各頂点の初期距離を計測し記録します。
各頂点は思い思いに移動しようとしますが、この接続により各頂点の距離を計測し、出来るだけ初期距離になるよう強制してあげます。
これによって初期の形状をある程度維持するだけです。
まず各頂点の接続マップを用意し、その各頂点の初期距離を計測し記録します。
各頂点は思い思いに移動しようとしますが、この接続により各頂点の距離を計測し、出来るだけ初期距離になるよう強制してあげます。
これによって初期の形状をある程度維持するだけです。
例題では三角形状に置かれた各頂点とそれに接続する紐状の各点を接続マップで結んでいます。
初期距離は接続マップにより自動計測され記録されます。
後は各頂点に重力加速を各頂点の移動ベクトルに加算するだけです。(例題ではY軸に定数を単純加算)
その後形状を維持するために各頂点の距離を接続マップにしたがって計測し直し、差分の一部を移動ベクトルに加算します。
基本はこれだけです。
初期距離は接続マップにより自動計測され記録されます。
後は各頂点に重力加速を各頂点の移動ベクトルに加算するだけです。(例題ではY軸に定数を単純加算)
その後形状を維持するために各頂点の距離を接続マップにしたがって計測し直し、差分の一部を移動ベクトルに加算します。
基本はこれだけです。
ここで重要なのは、各移動ベクトルに差分の一部を加算するところです。
各頂点は、既に移動していますのでそれを置換えることは出来ません。
よって次回以降に少しでも元の形状に近づけるため、少し補正してあげると言うことになります。
これがバンパープログラムです。
各頂点は、既に移動していますのでそれを置換えることは出来ません。
よって次回以降に少しでも元の形状に近づけるため、少し補正してあげると言うことになります。
これがバンパープログラムです。
これは自然的なプログラムでもあり、剛体的な発想ではなく柔軟なプログラムとも言えます。
自然界では全てのものが柔軟で伸びたり縮んだりしています。全くの剛体など存在しないはずです。(分子レベルでは)
このブログラムではそれが極端に表現されていますが、かえって現象を解りやすく理解できるかと思います。
これを少し剛体に近づけるとすると、バネの強度を増せば良いかと思います。
これは単純にバンパーロジックを数回ループさせると効果的です。
自然界では全てのものが柔軟で伸びたり縮んだりしています。全くの剛体など存在しないはずです。(分子レベルでは)
このブログラムではそれが極端に表現されていますが、かえって現象を解りやすく理解できるかと思います。
これを少し剛体に近づけるとすると、バネの強度を増せば良いかと思います。
これは単純にバンパーロジックを数回ループさせると効果的です。
このプログラムでは各質点の重力加速は一定になっていますが、別に質点マップを持てば重さの違う質点も簡単に表現できます。
バランスゲームなんかには使えるかもしれません。
もう少し高度に各線分との当り判断や接触時の摩擦係数を付加するとより現実的な動きになるかと思います。
まーゲームレベルでは何に使うかにより面白さも変わりますので、現状は実装していません。
(接続するバンパー距離を動的に変更することでアクチュエーターを作り、歩行ロボットなども簡単に作れます)
バランスゲームなんかには使えるかもしれません。
もう少し高度に各線分との当り判断や接触時の摩擦係数を付加するとより現実的な動きになるかと思います。
まーゲームレベルでは何に使うかにより面白さも変わりますので、現状は実装していません。
(接続するバンパー距離を動的に変更することでアクチュエーターを作り、歩行ロボットなども簡単に作れます)
このプログラムは非常に簡単で基本的なものですが、ゲームなどのプログラムに使うと面白い効果があると思いますのでお試しください。
【参考】