teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回転量算出の誤りを訂正、角速度上限について追記

2021/10/15 09:44

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -8,10 +8,8 @@
8
8
  // 現在の姿勢から目標姿勢への回転はこうなり...
9
9
  var relativeRotation = math.mul(targetRotation, math.inverse(自分.rotation));
10
10
 
11
- // relativeRotationのxyzの大きさとwから回転量が得られ...
11
+ // relativeRotationのwから回転量が得られ...
12
- var sinTheta = math.length(relativeRotation.value.xyz);
12
+ var angle = 2.0f * math.acos(math.saturate(relativeRotation.value.w));
13
- var cosTheta = relativeRotation.value.w;
14
- var angle = math.atan2(sinTheta, cosTheta);
15
13
 
16
14
  // relativeRotationのxyzの向きが回転軸となる
17
15
  var axis = math.normalizesafe(relativeRotation.value.xyz, Vector3.up);
@@ -19,4 +17,15 @@
19
17
  rigidbody.angularVelocity = axis * (angle / Time.fixedDeltaTime);
20
18
  ```
21
19
 
20
+ ![図1](5f50edbc49029fd3e749017de183c10e.gif)
21
+
22
+ なお、上図ではターゲットを素早く動かしても少々ゆったり追従する動きになっています。
23
+ これは`Rigidbody`の角速度がデフォルトでは7ラジアン/秒までに制限されているためでして、`Start`あたりで最大角速度を無制限にしてやれば...
24
+
25
+ ```lang-csharp
26
+ rigidbody.maxAngularVelocity = Mathf.Infinity;
27
+ ```
28
+
29
+ 下図のように一瞬で追従するようになるかと思います。
30
+
22
- ![図](728f4106875e882d5900538bf30163e0.gif)
31
+ ![図2](ca1b2083d06570ec24c89440bf6d58e7.gif)