究極のおっぱいシミュレーター完成!!
かねてより私が提唱している水圧モデルのおっぱいシミュレーターですが、幾多の年月を経てついに究極のシミュレーターが完成しました。
(画像は本文とは一切関係ありません)
アルゴリズムは以前とほぼ同じですが、今回は待望であった3次元への拡張を果たしたうえ、マルチタッチに対応、さらには変形に伴う体積の変化に応じて内圧が変化するためドラッグ時の質感にも圧倒的な向上がみられます。
ではまず理論的な解説をした後で、デモ動画をお見せしたいと思います。
なお今回のシミュレーターのアルゴリズムは特定のプログラミング言語やライブラリに制限される物ではありませんが、原理をブラウザ上で簡単に確認できることから、以下の説明では拙作物理エンジンBox2DJSを使用します。
まずはじめに内圧を支えるスキンを用意します。[ fig.1 ]
var radius = 80; var nop = 20; for (var i = 0; i <= nop; i++) { var theta = (i / nop) * Math.PI var p = new Point(radius * Math.sin(theta), 200 - radius * Math.cos(theta)); var fixed = ([0, nop].indexOf(i) != -1); var mp = createMassPoint(p, fixed); bodies.push(mp); } for (var i = 1; i <= nop; i++) { var jointDef = new b2DistanceJointDef(); jointDef.body1 = bodies[i - 1]; jointDef.body2 = bodies[i]; jointDef.anchorPoint1 = bodies[i - 1].GetCenterPosition(); jointDef.anchorPoint2 = bodies[i].GetCenterPosition(); world.CreateJoint(jointDef); }
スキンはドラッグする際に直接触れる部分ですので、吟味を重ねほどよい弾力と張りを併せ持つ好みの素材を選ぶとよいでしょう。
スキンの用意ができたら内部に流体を充填します。[ fig.2, fig.3 ]
for (var i = 1; i < bodies.length - 1; i++) { var prevBody = bodies[i - 1]; var body = bodies[i]; var nextBody = bodies[i + 1]; var vec1 = body.GetCenterPosition().Copy(); vec1.Subtract(prevBody.GetCenterPosition()); var vec2 = body.GetCenterPosition().Copy(); vec2.Subtract(nextBody.GetCenterPosition()); vec1.Add(vec2); vec1.Normalize(); vec1.Multiply(1450); body.ApplyForce(vec1, body.GetCenterPosition()); }
なお、振動の減衰率は流体の粘性で調整できます。流体の選択に当たっては本資料をお役立てください。
以上の手順を踏むだけで重力とパスカルの原理の相互作用により見事にOppaiがシミュレートされます。
・・・
ではそろそろ実際のシミュレーターの作成に移ります。
作成手順については文章よりも動画の方が理解しやすいでしょう。以下をご覧ください。
http://www.youtube.com/watch?v=IUjgAV61Cpk
究極のシミュレーターを用いれば、所謂ぱふぱふ的な所業も誰はばかることなく楽しめます。
http://www.youtube.com/watch?v=90VyvOhPmA0
Enjoy Oppai!