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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

1724閲覧

unityのphysxのangularVelocityによる姿勢制御について

k.shiho

総合スコア5

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2021/10/14 13:08

お世話に成ります。
Unityの物理エンジンPhysxを使っています。UnityPhysicsじゃない方です

掲題の通り、RigidBodyを持つオブジェクトに対して姿勢制御を行いたいのですが
剛体が効いた状態のRigidbodyを生かした状態で姿勢制御を行うとしたら2通りしか無さそうな事が分かりました。

一つはRigidBody.MoveRotation(もしくはRigidBody.Rotation)に値を与えると言う方法でした。
こちらは簡単で、何も考えず、LoockRotation等の値を利用してRotation値を与えれば解決できると感じました。

もう一つはAddTorque(angularVelocity)に値を与えて角速度を得ると言う物でした。
現在検証の為、角速度で実現できるか試しています。
角速度を使って姿勢制御を行いたいのですが余り文献が無く上手く制御できません。
自分なりに書いてみたスクリプトを記載します。
何となく目的の方向に向くのですが、何となくで、しかもAtan2の-πと+πの境(つまり真後ろ)に目的が存在すると、-πと+πの間を行き来して真後ろを向けてプルプルした状態で安定(?)してしまいます。
目的の方向に向くための角速度を得る方法をどなたかご存知でしたらご教示願えますでしょうか?

宜しくお願いいたします。

C#

1 var d = ターゲット.position - 自分.position;//worldvector 2 var inv = math.inverse(自分.rotation); 3 var localpos = math.mul(inv, d);//local position 4 5 var atx = math.atan2(localpos .y, localpos .z);//仰角 6 var aty = math.atan2(localpos .x, localpos .z);//方位角 7 rigidbody.angularVelocity = new float3(atx,aty,0);

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

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

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

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

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

guest

回答1

0

ベストアンサー

角速度の場合でもLookRotationを利用できるように思います。
たとえば下記のような形はいかがでしょうか。

lang

1var d = ターゲット.position - 自分.position;//worldvector 2var targetRotation = Quaternion.LookRotation(d); 3 4// 現在の姿勢から目標姿勢への回転はこうなり... 5var relativeRotation = math.mul(targetRotation, math.inverse(自分.rotation)); 6 7// relativeRotationのwから回転量が得られ... 8var angle = 2.0f * math.acos(math.saturate(relativeRotation.value.w)); 9 10// relativeRotationのxyzの向きが回転軸となる 11var axis = math.normalizesafe(relativeRotation.value.xyz, Vector3.up); 12 13rigidbody.angularVelocity = axis * (angle / Time.fixedDeltaTime);

図1

なお、上図ではターゲットを素早く動かしても少々ゆったり追従する動きになっています。
これはRigidbodyの角速度がデフォルトでは7ラジアン/秒までに制限されているためでして、Startあたりで最大角速度を無制限にしてやれば...

lang

1rigidbody.maxAngularVelocity = Mathf.Infinity;

下図のように一瞬で追従するようになるかと思います。

図2

投稿2021/10/14 18:51

編集2021/10/15 09:44
Bongo

総合スコア10807

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

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

Bongo

2021/10/15 09:45

すみません、当初のコードではrelativeRotationから得た角度を2倍するのを失念していました。また、回転量を得るのにはw成分だけ使えば十分で、xyz成分まで使う必要はありませんでした。回答のコードを訂正いたします。
k.shiho

2021/10/15 10:16

Bongo様 いつもありがとうございます! 余りのレベルの高さに理解するのに時間が掛かりました。 まさか生のQuartenionをぶん回す知見が得られるとは思いませんでした。 長くバイブルとさせて頂きます! お蔭様で数日悩んだことが解決しました!どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問