FlatTable_P.swf の画像 ビリヤード配置図ソフト
FlatTable
土曜日の実験室

ここでは、作成途中で正式公開に至っていないソフトウェアを掲示したり、FlatTableなどを用いて行った実験について記します。

アニメーションの異常動作 2014.05.06...05.15

SVG 版 FlatTable でアニメーションに異常動作が確認されました。その異常動作は次の配置図で確認することが出来ます。図の1ページ目と2ページ目はほとんど同じですが、僅かに球1番・2番間の距離が異なります。


この図の1ページ目でアニメーションを実行すると2番はクッションに届く前に1度停止し、その後、クッションから運動を再開します。それに対して、2ページ目は開始から終了まで正常な速度で運動が実行されます。

この動作の違いは、1番・2番間の距離の違いによって生じています。両ページの1番・2番間距離は次のようになっています。ただし、球間距離は球の中心の距離を表しています。

球間距離直径との差
1ページ目14.341.14
2ページ目17.384.18

球の直径は 13.2 で、球間距離が 13.2 の時ピッタリ接していることになります。衝突判定は直径の ±10% で行っています。したがって、1ページ目の1番・2番は初期配置で接触していることになり、2ページ目では離れていることになります。

まず、正常な2ページ目の方から動作を見て行きましょう。球は動き始める時に runList という配列に登録され、アニメーションの対象となります。2ページ目では、まず、手球が runList に登録され、1番に向かって進んで行きます。手球が1番に当たると、その1番が runList に登録され、動き出します。それが2番に当たり、2番も runList に登録され、動き出します。そうやって、それぞれの球が終点まで移動して行きます。

次に、1ページ目(異常なページ)の動作を見て行きましょう。手球が1番に当たり、1番が動き出すところまでは2ページ目と同じです。ところが、1ページ目の1番・2番間距離は「直径 ± 10%」以内に入っています。即ち、1番・2番は接触していると見なされるわけです。したがって、手球が1番に当たった時に、2番も runList に登録されます。その際、2番の speed は図中の節点 A での speed が設定されます。さらに、動き出した1番はその直後に2番に当たるので、この時も2番は runList に登録されます。結局、2番は runList に2回登録されることになります。そして、2回目の登録の時、2番の speed は節点 B の speed で上書きされます。この時、2番はまだ節点 A の近くに居ます。 B での speed は A での speed よりも遅いので、2番は本来よりも早く speed が0になり、途中で停止することになったわけです。

この問題の対策として、球の衝突時はその球が runList に登録済みかどうかをチェックすることで2重登録を防ぐようにしました。対応済みのものを以下に示します。


オープニング・ブレイク 2011.11.14

下図の1ページ目をアニメーションさせてみてください。


ラックに当たった後の手球の速さが、やたら速くなっています。これは、FlatTableの実装のせいです。

FlatTableでは、球の速さは当てられた方の球の速さを元に決定されます。例えば、球Aが球Bに当たって、そのBが散乱角度30°、速さ1m/sec で動き出したとすると、衝突時の球Aの速さは (1/cos30°≒1.15) / 反発係数 m/sec となります。そして、衝突後の球の速さは、ラシャの抵抗およびクッションの反発係数で減速しながら最終的に0になります。そこでFlatTableの実装では、衝突直後の速さは停止から逆算して求めています。

これらを踏まえて、図の1ページ目のアニメーションを見てみましょう。手球がラックに当たって1番・5番が動いています。この2個の速さから手球の初速が決定されます。そして、衝突後の手球の速さは、停止位置まで走るのに必要な速さとして求められています。

このアニメーションから、1番・5番を塊に戻すための手球の強さは比較的弱いのに、衝突後、手球をヘッドレール付近まで走らせるには、ある程度の強さが必要であることが分かります。それにしても、1ページ目の手球の動きは不自然過ぎます。

そこで、手球が自然な速さで走るように停止位置を調整したのが2ページ目になります。手球はかなり手前で止まっています。

実際のプレーでは、この不足分を補うために捻りを入れます。そうすることで3ページ目の走りが得られます。FlatTableには捻りを設定する機能は有りませんが、クッション直後に次のような細工をすることで擬似的に捻りの効果を入れることが出来ます。

ゴーストのメニューに「減速倍率」というのが有ります。これは、ラシャ抵抗による減速の度合いを変更するものです。仮に 100 を設定すれば、通常の減速の 100 倍の効果が得られ、急激に減速します。ここに、負の値を設定すると、加速の効果が得られます。そこで、クッション直後にゴーストを生成して、それに負の減速倍率を設定することで、あたかもクッションで加速したような動きをさせることが出来ることになります。3ページ目は、そうやって作図しています。

2ページ目と3ページ目を比べてみると、手球の走る距離に、かなりの違いが有るのに驚きます。この分を捻りで稼いでいることになるわけです。ただし、これはFlatTableでの実験結果であって、実際は、捻り無しでも台の中央近くまで走るようです。

アニメーション 2011.03.26...04.02

(完成版は 2011.04.02 に Ver2.0 として公開)

操作方法

配置図を作成した後、FlatTable左上の[A]をクリックすると、配置図に従って球が動きます。ただし、手球と的球の移動量に不整合が有ると、手球の停止位置は、指定と異なったものになります。

アニメーション後、再度[A]をクリックすると、アニメーション前の配置図に戻ります。その前に、[A]のメニューで終点修正を選択すると、アニメーション前の配置図に戻った時、球の終点位置がアニメーションの終点に修正されます。

どれか1個が2回以上衝突すると、正常な動作をしないというバグが有ります。(バグ解消:2011.03.27)


手球の走り具合

図の配置でアニメーションしてみると、手球が黄球まで届かないという現象が起きます。厚みが厚いため、手球の勢いが的球に取られてしまうからです。試しに、当たりを少し薄くしてみて下さい。例えば、手球が的球に当たっている位置を1ピクセル下にずらすだけで、手球の移動距離が伸びるのが明白に分かります。1ピクセルの移動は、そのゴーストをクリックした後で、矢印キーを1回押すことで出来ます。

ところで、図に示した軌道は、現実のプレーでは普通のことであり黄球まで届かないというのは、あまり経験しないことです。何が違うのでしょうか?

考えられる原因として、押しと捻りの回転が有ります。図の場合、現実のプレーでは、手球の右上を撞いて、押しと捻りを与えます。それにより、手球は充分黄球まで転がって行きます。それに対して、このアニメーションでは、それらが考慮されていません。そのため、手球は充分な推進力が得られず、途中で止まるのだろうと考えています。

最終的には、それらの効果も取り入れる必要があります。

アニメーション(サンプル) 2011.04.21...2015.09.05