Himo for GL
1. 導入 -インストールとか-
himogl.zipをフォルダに展開することでインストールできます。
アンインストールする場合はフォルダごと削除してください。
レジストリの操作はしていません。
このソフトウェアはGPLライセンスです。ソースつきなので、ほしいところだけ持っていって好きなだけ改造してください。
また、このソフトウェアを使用したことによる一切の責任を作者は負わないものとします。
2. 特徴 -どんなシミュレータやねん-
Himo for GLは、ひもの動きをなんとなくシミュレートする物理シミュレータです。
昔作ったHimo(未公開)をバージョンアップして、OpenGL[1]で表示するようにしました。
- ひもを動かして、結び目を作ることができます。
- 前のバージョンに比べて、いやな振動が軽減されました。
- 結び目を作って引っ張ると、数値的に不安定になります。それによって ひもがぐるぐる回りますが、これはこれで楽しいです。(もちろん、物理的に正しくはない。だってどう見ても永久機関だもん。)
- 「結び目を作ろう」とか色々できるかと。
3. 操作法 -どうやって使うねん-
- himo.exeをダブルクリックすると起動します。
- 起動すると、画面上に青い点が現れます。それがマウスカーソルです。
- 右ドラッグすると視点が移動して、いろんな方向から見ることができます。
- もの先端にくっついている青い点
またはひもの一部を左ドラッグすると、その点が移動して、ひもを変形することができます。
4. 技術情報 -中身どないなってんねん-
以下、どうやって作ったかを好きなだけ説明します。
4.1. ひもの動き
- ばねモデル
ひもを「連結したバネ」とみなして、連成バネの運動方程式をオイラー法のようなもので超テキトーに解きます。(原子炉で使うんじゃないんだから、超テキトーで大丈夫です。)
オイラー法は、現在の位置rと速度vが分かっているとき、時間冲後の位置はr(t+冲)=r+冲vになるだろう、っていうやつです。(微分方程式を数値的に解く方法のひとつです。)
本当は、全ての点できちんと加速度を求め、次に全ての点で速度を、次に全ての点で変位を...としないといけないんですが、この方法ではバネの変位から直接 制御点を移動してしまいます。金子勇[3]さんがやってたやつと同じです。要は、あるバネだけに注目して、バネが長ければ短くなるように、短ければ長くなるように、バネの両端の点を移動していくことを繰り返していくわけです。
各バネの計算には、そのバネの両端の点の位置が必要なのですが、1回の走査で位置情報を直接書き換えながら各点を計算するので、波の伝播が偏ってしまいます。
これだと、左端で起きた波は右端へ行きますが、右端で起きた波は消えてしまう、みたいになります。なんか 気まずいです。


そこで、繰り返しごとに走査方向を入れ替えました。こうすると わりと均等に波が伝播してくれます。
- 拘束条件1
両端の位置を(マウスで動かせるけど、それ以外のときは)固定します。固定端というのは波が跳ね返ります。それはそれでいいのですが、あんまり跳ね返りすぎて不安定でした。
そこで、固定端は「ひも の長さによって固さが変わるような(奇妙奇天烈でストレンジな)バネ」に結合することにしました。
具体的には、ひもがある程度引っ張られると 急激にゆるくなるようなバネを使います。

また、ひもの中間部分を引っ張るときも、このバネを結合してからバネの先を引っ張ります。
- 拘束条件2
ひも の微小部分を球とみなして、球をぶつけ合う感じで ひも を重ならないようにしました。
ここでも、ばねモデルと同じように、各点を直接書き換えながら走査していき、繰り返しごとに走査方向を入れ替えます。
球の半径は、ひも の微小部分の標準的な間隔よりも少し大きめになっています。
これによって、ひもとひもの すり抜けを起こりにくくしています。でも、速度が大きすぎると、やはり すり抜けてしまいます。ひもがすり抜けてしまうと、結び目が解けてしまったりして、いろいろ都合がよくありません。
そこで、空気抵抗のようなものを加えたり、1回の計算で動かす時間を短く(時間刻みを細かく)したりして、大きい速度が発生しにくいようにしています。

4.2. マウス入力
画面のマウス座標を3Dのワールド座標に変換します。現状では画面の並行移動をしていないので、回転中心は原点として計算できます。もちろん、平行移動しても基本的には同様の計算で実現できます。
まず、マウス座標を「カメラから発生するレイ」とみなします。カメラ座標とワールド座標の幾何学的な関係から、レイのベクトルを回転したりしてワールド座標に変換します。
マウス座標はもともと2次元なので、距離情報はなく、該当する3D上の座標は直線になります。要は、カメラからカーソルの直線がレーザー光線のように伸びている感じです。

そこで、距離情報はマウスカーソルのレーザー光線が ひも に重なったときに、その座標をもとに計算します。
また、ひもを動かすときは、ドラッグし始めたときの距離情報をできるだけ保存するように移動します。つまり、スクリーンの平面と平行な平面上を動きます。
5. 今後の課題 -これからどないなんねん-
- もうちょっといい入力方法を考える。
- ひもの接続形状を自由に変更できるようにする。(Y形とか、O形とか、θ形とか。)
- 他物体も追加できるようにする。
6. 参考文献 -どっからコピペしてん-
[1] OpegGL - The Industry Standard for High Performance Graphics
http://www.opengl.org/
[2] 情報工学研究部
http://jyoken.net/
[3] Kaneko's Software Page
http://homepage1.nifty.com/kaneko/index.htm
吉村 亮悟
ry@jyoken.net