motoh's blog

主に趣味の電子工作やプログラミングについて書いていきます

Unityでペンシルロケットの運動を確認

高校で習った物理で、式の上では理解していても、実際に確かめたことはないものが多いですよね。そのような物理現象を、Unity物理エンジンで確かめたらおもしろいのではないかと思い立ちました。(物理を習ったのは大昔で、Unityも初心者なので、いろいろ突っ込みどころがあるかもしれません。)

今回はペンシルロケットの運動を確認します(ペンシルロケットについては、高校物理の問題集でたまたま知っただけなので深くは語れません)。ロケットは物体を水平後方に瞬間的に放出することで、反作用を受けて前方に加速されます。このとき、放出の前後で運動量が保存されます。これらについて、Unityで確認してみたいと思います。

※運動量の保存は過去記事 Unityで運動量保存の法則を確認 - mizu-mi blogでも確認しましたが、そのとき扱ったのは物体同士の衝突でした。今回は新たに放出における運動量保存を確認します。

 

ペンシルロケットを飛ばしてみる

まず、物体の放出をどのように実現するかです。ロケットが反作用を受ける必要があるので、ここではバネ(Spring Joint)を利用しました。初期状態をバネが縮んだ状態にしておけば、スタートと同時に物体が放出されます。

■初期状態

f:id:mzmlab:20190213234110p:plain

■放出

f:id:mzmlab:20190213234127g:plain

飛びました(^^)

この絵だとあまり迫力はありませんが、瞬間的におよそ時速70kmに達したことになります。

 

放出前後の運動量保存を確認

ロケットの質量m12kg、物体の質量m25kgとしました。放出後の運動量を計算すると、

    m1v1m2v2 = 2×19.0992 + 5×(-7.6397)
                          = 38.1984 – 38.1985
                          ≒ 0

放出前の運動量は、静止しているため0です。よって、運動量が保存されていることになります。

 

[付録] ペンシルロケットの作り方

構成

ロケットは4つのオブジェクトで構成されています。

 ①ロケットの胴体(Cylinder
 ②
バネの可動部(Cylinder
 ③
放出物(Sphere
 ④
ロケットの先端(飾り。blenderで円錐を作成)

f:id:mzmlab:20190217161749p:plain


Hierarchy

 ①ロケットの胴体(Rigidbody、Spring Joint付加
  +
④ロケットの先端
 +
②バネの可動部(Rigidbody付加 )
 +
③放出物(Rigidbody付加 )

 

[ポイント]

・①ロケットの胴体と②バネの可動部はSpring Jointを付けるためにRigidbodyを付ける必要があります。

・①ロケットの胴体はColliderを外し、②バネの可動部と③放出物がすり抜けるようにしています(本当は胴体を筒状にできれば本物っぽいのですが)。

・④ロケットの先端は①ロケットの胴体の子オブジェクトにします。そうしないと、ロケット発射した際、先端だけ動かずに置いて行かれます(親オブジェクトにRigidbodyが付いてないと、子オブジェクトは一緒に動いてくれないようです)。

 

バネの取り付け

f:id:mzmlab:20190217160408p:plain

Spring Jointは胴体側に付け、Anchorは胴体の端に設定します。Connected Bodyに可動部を割り当て、Connected Anchorを可動部の端に設定します。

Spring JointMIN/MAXにバネの自然長を設定します(ここでは3mとした)。
MIN/MAX
の意味はこちらにまとめました。

・可動部の初期位置は適当にバネが縮んだ状態にします(ここでは0.5mとした)。

・胴体や可動部のサイズは適当に調整します。

 

ロケットの先端(円錐)の作成

Unityに円錐がなかったので、Blenderで作成しました。以下のサイトを参考にして、円錐の作成からUnityへの取り込みまで簡単にできました(サイト内ではテクスチャを割り当てていますが、今回は不要)。

ピラミッドを作る - socialakiba wiki