UTFのプログラミング勉強部屋

趣味でプログラミング(Python)とUnityを勉強中の社会人です

野球で使用する設備の寸法

ボールを射出する機構は完成しました。(揚力は別で考えていきます)

 

このままでは殺風景で味気ないので野球場らしく変えていきたいと思います。

そのためにまずバッターボックス周りの作成から着手します。

 

ホームベースとバッターボックス、ファール/フェアのラインがあれば一発で野球であると認識できるので、これらの設備を作っていきます。

 

まずはホームベース(五角形)を作っていきますが…

調べてみると意外と出てこないですね。殆どの方はUnityのほかに3Dでモデリングできるソフトを別で使っていて、Unity上で製図のようなことはしていないみたいですね。

 

しかし今回はそんな複雑な物でもないので別ソフトを利用しなくてもできるはず…

とりあえずホームベースの寸法

 

ホームベースは正五角形ではなくダイヤモンドのような形状をしているので長方形;三角形で作れそうですね

長方形と正方形を用意して…

 

ドッキングすればホームベースになりました!

これを一つの親フォルダに入れて運用すれば問題なく動くはずです。

 

ホームベース~マウンドプレートの間隔が18.44m

マウンドプレートから1.8m前進してリリースする前提なので…

ホームベースのお尻部分~リリースポイントが16.64mになるよう設置

ホームベースの長さが約43.2cmなので中心~お尻は21.6cm = 0.216m

つまりリリースポイント~ホームベース中央は約16.42m

 

 

次にバッターボックスです。

これは長方形を組み合わせれば簡単にできそうですね

バッターボックスの外枠を表現する白い長方形と、その中を背景と同じ色(今回は黒)で埋める一回り小さい長方形でOKだと思います。

 

 

これがバッターボックスの寸法。

 

 

最後にフェア/ファールゾーンを仕切るライン

これはホームベースの斜めのラインの延長線らしいですね(知らなかった)

 

バッターボックスとファールラインを足した結果がこちら

 

大分野球っぽくなってきました!

投球の軌道をUnity上で再現する(書きかけ)

この記事では回転数と変化量の関係を記載していきます

 

綺麗に〇rpmあたり〇mmのホップというデータは見つからなかったので、実績ベースで考えていきます。(おそらく球速と減衰もあるので一貫した数値で表せない)

 

一般的ストレートにはバックスピン成分とサイドスピン成分とジャイロ成分があり、ジャイロ成分は変化に殆ど影響を与えないため無視されます。

(厳密に言うと球が落ち始めると変化しますが、一般的に使われる回転効率からも省かれているので…)

バックスピン成分は縦方向の変化に寄与し、サイドスピン成分は横方向の変化に寄与します。

 

 


左投手の投球はサイドスピン成分が逆方向ですが、左右反転して考えます。

完全なバックスピン回転を90°、右投手の完全なシュートを0°とすると

 

有効回転数 = 回転数 * (1 - 回転効率)

縦方向有効回転数 = 回転数 * sinθ

横方向有効回転数 = 回転数 * cosθ

 

で表せます。(多分)

 

有効回転数あたりの変化量は縦横を問わないはずなので、

縦方向変化量 = 定数k * 縦方向有効回転数 * 飛行時間

横方向変化量 = 定数k * 横方向有効回転数 * 飛行時間

で求められるはずです。(定数kは同じ値)

 

ここからは実際の測定結果を元に定数kを求めていきます。

幸いネット上にはラプソードで投球を測定したデータが多数存在しているので、

そのデータを集計し、定数kを求めていきます。

 

 

 

 

野球における揚力をUnity上で再現する(やり方を考える編)

野球でピッチャーが投げる球は(完全なナックルを除き)回転がかかっており、それに応じて軌道が変化します。

ストレートのようなバックスピン系は揚力(浮き上がる力)が働きますが、これをUnity上で再現したいと思い、情報をまとめていきます。

 

揚力が働く原理として、ボールがバックスピン回転することで空気中の分子が上に押し上げられ、

ボールの上面では空気の流れが速くなる→低圧

ボールの下面では空気の流れが遅くなる→高圧

となり圧力差でボールが上方向に引っ張られるというものです。

 

ぶっちゃけあまり分かってないです。

これと同じ理由で起こる現象として、扇風機の風に紙を近づけたら、風に引き寄せられるという物があり、やってみると確かに引き寄せられるのでそういうもんとして理解しました。

(出典:東京工業大学

 

要するにUnity上でこの空気の動きを再現すればボールの軌道も再現できるのですが、Unityは空気抵抗には対応していても、回転による空気の流れには対応していないのです。(そもそも空間上に空気の分子がなく、空気抵抗を数値で設定するようになっている)

無数の空気分子を空間に充満させると計算量がとんでもないことになるので、これはしょうがないと思います。

ちなみにAngular Dragという項目がありますが、これは回転力の減衰を決定するためのパラメータで、回転による空気の移動とは無関係です。

 

ここまでの情報から、Unityには回転による揚力を設定するパラメータが存在しないので、何か別の方法で用意してやる必要があると分かりました。

 

方法は2通りあると考えていて、①の方法で行こうと思っています。

 

①既知の変化量を予めスクリプトに入れておく

野球はデータのスポーツなので、「X回転/minで回転軸が〇〇、球速〇km\hの時のホップ量が〇cm」というデータは既に存在しています。

この数値を予め計算に入れておこうという考え方です。

 

つまり、今はZ軸方向にAkm/hで射出というプログラムのみを入れていますが、これに加えて、キャッチャーミットに到達するまでにY軸方向にBcmホップするというデータを加えます。

これなら後に解決しようと思っていた「野球には縫い目があるから変化量が真球とは異なる問題」も解決できて一石二鳥です。

 

②無数の空気分子をsphereで作り、空間に存在させておく

これは単純で、Unity空間上にデフォルトで空気分子が存在ないなら、自分で追加するという方法です。

ただこれはパッと思いつくだけで懸念が多数あって、多分どこかで躓くのでやめておこうと思います。

【懸念】

・分子を疑似的に実装したところで空気圧の概念は働くの?

・分子の形は球で良いの?

・無数ってどれぐらいの数があれば良いの?

・空気の摩擦係数ってどんなもの?

・空気は自由運動?留まらせる?

・そもそも私のPCで処理できるの?

 

次回の記事で、回転数とホップ量のデータを書いていきます

 

Unity用語メモ

Unityの用語の意味や設定の仕方の備忘録まとめです。

何かに入力した方が覚えられるので、こういう形でまとめます

 

Collider

衝突点

実際のオブジェクトに重なる形で衝突点を設定する

スマブラとかでキャラのビジュアルと当たり判定が異なるあれだと思う

 

Drag

空気抵抗

 

Angular Drag

回転時の空気抵抗

 

スクリプト

コンピュータが理解できる言語への変換作業を省略して、簡単に解釈実行できるようにした簡易プログラムのこと

 

if(Input.GetMouseButtondown(0))

左クリックが押されているかを判定する

0→左クリック、1→右クリック

 

new Vector3(x,y,z)

X, Y, Zへの移動速度を与える。単位はm/s

 

rigidbody.angularVelocity = new Vector3(x, y, z)

X, Y, Z軸を中心とした回転速度を与える単位は(角度/s)

 

 

Unityで作る動画の題材と各種数値のメモ書き

色々考えたのですがUnityで作る動画の内容は「野球で投手が投げた球を捕手目線から見る」にしようと思います。

 

【野球にした理由】

・捕手目線、というか投手に正対した視点の写真、動画は殆どなく、需要がありそう

・中継カメラから見るのと捕手から見える球の軌跡は全く違うので、新鮮な動画になりそう

・球の回転数とスピードだけ設定すればよいので私でも出来そう

(実際は縫い目を作らないと現実のボールと異なる挙動になりますが、それは追々ということで)

 

【基礎情報】

・硬式球の寸法

直径:72.93~74.84mm

重量:141.7~148.8g

反発高さ:48~55cm

(反発高さの数値はありましたが、どの高さから落とすのかの記載を発見できず...)

反発係数:0.4034〜0.4234(NPB公式)

 

調べた後思いましたが今回の検証では球を投げるだけで打つわけじゃないので、直径以外必要なかったかもしれないですね

 

・距離

マウンド~ホームベースの距離:18.44m

実際のところ捕手はホームベースよりも外で構えているし、投手も踏み込んで投げるのでリリースポイントはもっと前になるので補正をかけます

↓ リリースポイント:プレートから204.2cm(2019年MLB最長) ,日本のデータは無いのですが、仮に1.8mとします

↓捕手の位置:どこにも載っていないというか打者の立ち位置によって打撃妨害にならない範囲で前にでるようなので、今回は一律1mとします

つまり差し引きでリリースポイント~キャッチャーミットは17.64mとします。

 

・リリースポイントの高さ

Baseball Savantより、MLBの左投手のリリースポイント

 

リリースポイントの高さは1.8mとします。

(実際のところNPBはもう少し低いと思いますが)

 

・捕手のミットの高さ

私がバッターとして構えたとき、ストライクゾーン中央~地面が大体0.7mでした

私の体格はプロ野球選手と比べると小さいので、ここでは0.8mとします。

 

【実際に作る内容】

ここまでの話を総合すると、

「直径73.5mmの球体を17.64m移動させ、この時1.8mの高さから0.8mの高さへ移動する」という内容になります

初速と回転数については考え中です(平均的な投手にするか、それとも佐々木投手のようなキャッチーな投手にすべきか…)

 

記事は一旦これで切ります。

次はUnity上で製作しながら内容を記事にしていきます

Unityはじめました

Youtube上で物理エンジンを使った動画を見て、自分でも挑戦したいと思いUnityを導入しました。

これから使い方を学んでいきます。

それにしてもUnityの存在は知っていたがまさか無料だったとは...

(企業用や収益を得る人はお金を支払う必要があります)

 

こちらも作って終わりでは面白くないので最終目標はYoutubeへUnityを使った検証動画をアップすることとします!

 

Unityの画面はこんな感じです

 

YouTubeにアップ動画の題材について考えたのですが、例えば「単純なゲームを作って遊んでみた」では誰も興味がないと思うので、ここはやはり物理エンジンの特性を活かした検証動画にしようと思います。

 

偶々拝見した動画でテニプリの白鯨に必要な回転数を検証した動画があって、これが最初の動画の方向性として良いかな~と思いました。

※白鯨は強力なバックスピンと風の力を利用して相手コートのベースライン付近でバンドしたボールが自陣に返ってくるというトンデモ技です

 

球体ならデフォルトで備わっているし、回転も(多分)パラメータをいじるだけで作れるので。

その動画では人間も登場させてラケットで打つところからやっていましたが、これは難しいので消して、いきなりボールが出ていく感じにします。

 

また進捗をブログ記事に書いていきます(ほぼ備忘録ですが)

ブログ始めました(2022年7月18日)

初めまして!UTFと申します。

化学系のメーカーに勤務する社会人ですが、新しいことにもチャレンジしたいと思い基本情報技術者とプログラミングの勉強を2021年から始めました。

ただ勉強して終わりでは虚しいだけなので何かアウトプットできるようにしたいと考え2022年2月にYoutubeチャンネルを作り、そして本日ブログを作りました。

www.youtube.com

 

Youtubeチャンネルの方では「○○を検証してみました」という形でアウトプットしてますが、ブログでは「○○を作りました」という形でやっていこうと思います。

 

あとは今やってるゲームのこともたまに記事にするかもしれません。

 

これからよろしくお願いします。