野球における揚力をUnity上で再現する(やり方を考える編)
野球でピッチャーが投げる球は(完全なナックルを除き)回転がかかっており、それに応じて軌道が変化します。
ストレートのようなバックスピン系は揚力(浮き上がる力)が働きますが、これをUnity上で再現したいと思い、情報をまとめていきます。
揚力が働く原理として、ボールがバックスピン回転することで空気中の分子が上に押し上げられ、
ボールの上面では空気の流れが速くなる→低圧
ボールの下面では空気の流れが遅くなる→高圧
となり圧力差でボールが上方向に引っ張られるというものです。
ぶっちゃけあまり分かってないです。
これと同じ理由で起こる現象として、扇風機の風に紙を近づけたら、風に引き寄せられるという物があり、やってみると確かに引き寄せられるのでそういうもんとして理解しました。
(出典:東京工業大学)
要するにUnity上でこの空気の動きを再現すればボールの軌道も再現できるのですが、Unityは空気抵抗には対応していても、回転による空気の流れには対応していないのです。(そもそも空間上に空気の分子がなく、空気抵抗を数値で設定するようになっている)
無数の空気分子を空間に充満させると計算量がとんでもないことになるので、これはしょうがないと思います。
ちなみにAngular Dragという項目がありますが、これは回転力の減衰を決定するためのパラメータで、回転による空気の移動とは無関係です。
ここまでの情報から、Unityには回転による揚力を設定するパラメータが存在しないので、何か別の方法で用意してやる必要があると分かりました。
方法は2通りあると考えていて、①の方法で行こうと思っています。
①既知の変化量を予めスクリプトに入れておく
野球はデータのスポーツなので、「X回転/minで回転軸が〇〇、球速〇km\hの時のホップ量が〇cm」というデータは既に存在しています。
この数値を予め計算に入れておこうという考え方です。
つまり、今はZ軸方向にAkm/hで射出というプログラムのみを入れていますが、これに加えて、キャッチャーミットに到達するまでにY軸方向にBcmホップするというデータを加えます。
これなら後に解決しようと思っていた「野球には縫い目があるから変化量が真球とは異なる問題」も解決できて一石二鳥です。
②無数の空気分子をsphereで作り、空間に存在させておく
これは単純で、Unity空間上にデフォルトで空気分子が存在ないなら、自分で追加するという方法です。
ただこれはパッと思いつくだけで懸念が多数あって、多分どこかで躓くのでやめておこうと思います。
【懸念】
・分子を疑似的に実装したところで空気圧の概念は働くの?
・分子の形は球で良いの?
・無数ってどれぐらいの数があれば良いの?
・空気の摩擦係数ってどんなもの?
・空気は自由運動?留まらせる?
・そもそも私のPCで処理できるの?
次回の記事で、回転数とホップ量のデータを書いていきます