http://d.hatena.ne.jp/Gemma/20080517/
http://masafumi.cocolog-nifty.com/masafumis_diary/2004/09/verlet.html
金子さんの資料を見ると、LinkというサンプルがParticle-IKと同じような感じだなーと思ったので試してみることにしました。Particle-IKについては下記のサイトでわかりやすく説明されております。
http://www.tmps.org/index.php?CCD-IK%20and%20Particle-IK
処理の流れは以下のようになっています。力や加速度などは考慮せず、現在の位置と1個前の位置から速度を計算しています。
1. 初期化処理でパーティクルの配置およびパーティクル間の初期長さを計算
2. 以下シミュレーションループ内で繰り返し
2-1. パーティクルの速度情報から現在の位置を計算
2-2. 制約条件(リンク間の長さが初期長さである、床に侵入しない等)から現在の位置を修正
2-3. 修正後の位置-1個前の位置=パーティクルの速度
2-4. 1個前の位置←修正後の位置として更新
実行結果
ダウンロードは🎥こちら
特に最大長の制限などをしていないので、指定した長さに必ずなるわけでもなくちょっと伸びちゃいますね。
外力として重力(による位置変化)、制約条件としてリンクの長さと床との衝突を入れています。パーティクルやリンクの衝突判定などをいれればもっとそれっぽくなりそうですが、どうなんですかね。
ソースコード置いておきます。btVector3のためだけにBullet使っています。
Particle-IK.zip
一応Particle-IKってプロジェクト名にしていますが、実際のParticle-IKとは違うんじゃないかなーと思います。