回答編集履歴
1
回転量算出の誤りを訂正、角速度上限について追記
answer
CHANGED
@@ -8,10 +8,8 @@
|
|
8
8
|
// 現在の姿勢から目標姿勢への回転はこうなり...
|
9
9
|
var relativeRotation = math.mul(targetRotation, math.inverse(自分.rotation));
|
10
10
|
|
11
|
-
// relativeRotationの
|
11
|
+
// relativeRotationのwから回転量が得られ...
|
12
|
-
var
|
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
|
+

|
21
|
+
|
22
|
+
なお、上図ではターゲットを素早く動かしても少々ゆったり追従する動きになっています。
|
23
|
+
これは`Rigidbody`の角速度がデフォルトでは7ラジアン/秒までに制限されているためでして、`Start`あたりで最大角速度を無制限にしてやれば...
|
24
|
+
|
25
|
+
```lang-csharp
|
26
|
+
rigidbody.maxAngularVelocity = Mathf.Infinity;
|
27
|
+
```
|
28
|
+
|
29
|
+
下図のように一瞬で追従するようになるかと思います。
|
30
|
+
|
22
|
-

|