質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

1921閲覧

Unity(2D) Rigidbody2DのAddTorqueを用いて、オブジェクトが1秒間に1回転するような回転の力を加えたいなど

uniNewbie

総合スコア10

0グッド

0クリップ

投稿2022/08/13 17:22

前提

オブジェクトの質量は1です。
angularVelocityを直接弄る(360とするなど)のは、物理演算上不自然になる(らしい)ため避けたいです。
重力や摩擦、回転の抵抗は無しです。

実現したいこと

1、オブジェクトは回転していない状態で、Rigidbody2DのAddTorqueにてオブジェクトが1秒間に1回転するような回転の力を加えたいです。

2、現在の回転速度に対してある力を加えた場合にどれくらいの回転速度になるかを算出し、
回転の制限速度を超えないならばそのままAddTorque
回転の制限速度を超えるならば、制限速度を超えない範囲でAddTorque
のようにしたいです。

補足情報(FW/ツールのバージョンなど)

Unityのバージョンは 2021.3.8f1 です。

私の理解度の参考として・・・そもそもangularVelocity=360で1秒1回転となること自体、Debug.Log(rb.angularVelocity); にて目視確認で突き止めたため、理屈が分かっていないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uniNewbie

2022/08/13 17:26

タグを忘れました。C#です。
guest

回答1

0

ベストアンサー

angularVelocity = 360で1秒1回転となることについては、angularVelocityのリファレンスページにある...

角度 / 秒で示される角速度

との記述から説明できるかと思います。angularVelocity = 360というのは秒速360°を表しますので、つまり毎秒1回転というわけですね。

制限速度を超えないようにAddTorqueを行う件については、AddTorqueのリファレンスページに例示されている...

C#

1using UnityEngine; 2 3public class TorqueRotationExample : MonoBehaviour 4{ 5 // Add an impulse which produces a change in angular velocity (specified in degrees). 6 public void AddTorqueImpulse(float angularChangeInDegrees) 7 { 8 var body = GetComponent<Rigidbody2D>(); 9 var impulse = (angularChangeInDegrees * Mathf.Deg2Rad) * body.inertia; 10 11 body.AddTorque(impulse, ForceMode2D.Impulse); 12 } 13}

がご参考になるんじゃないでしょうか。あれをベースに、一例としては下記のようなコードでどうでしょう。

C#

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class AddTorqueTest : MonoBehaviour 5{ 6 // 角速度の限界の絶対値 7 [SerializeField][Range(0.0f, 1440.0f)] private float angularVelocityLimit = 720.0f; 8 9 private new Rigidbody2D rigidbody; 10 11 private void Start() 12 { 13 this.rigidbody = this.GetComponent<Rigidbody2D>(); 14 15 // 挙動の確認のための下準備として、Start時にランダムな角速度を与えておく 16 this.rigidbody.angularVelocity = Random.Range(-360.0f, 360.0f); 17 } 18 19 private void Update() 20 { 21 if (Input.GetKeyDown(KeyCode.Space)) 22 { 23 // 現在の角速度を取得し... 24 var currentAngularVelocity = this.rigidbody.angularVelocity; 25 26 // 現在の角速度に対して1秒間に1回転...つまり360°/秒の 27 // 角速度変化を与えると、新しい角速度はこうなる 28 var newAngularVelocity = currentAngularVelocity + 360.0f; 29 30 // 新しい角速度が限界角速度を超えないようクランプし... 31 newAngularVelocity = Mathf.Clamp(newAngularVelocity, -this.angularVelocityLimit, this.angularVelocityLimit); 32 33 // 新しい角速度から現在の角速度を引いて角速度変化とする 34 var angularVelocityChange = newAngularVelocity - currentAngularVelocity; 35 36 // 角速度変化を弧度法に直して、さらに慣性モーメントをかけると角運動量変化が得られる 37 var impulse = angularVelocityChange * Mathf.Deg2Rad * this.rigidbody.inertia; 38 39 // オブジェクトの角運動量を変化させる 40 this.rigidbody.AddTorque(impulse, ForceMode2D.Impulse); 41 } 42 } 43}

投稿2022/08/13 22:52

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uniNewbie

2022/08/14 05:15

ご回答ありがとうございます。 まさに、やりたいことど真ん中です! >// 角速度変化を弧度法に直して、さらに慣性モーメントをかけると角運動量変化が得られる 自分でも調べていたのですが、このあたりが自力では見つけることが出来ずでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問