前提・実現したいこと
Unity標準アセットのFirstPersonCharacterのMouseLook.csにおいて、
クォータニオンの成分を処理して、おそらく角度制限していると思うのですが、
なぜこのような処理で角度制限できるのかわかりません。
・質問1。
下記のコードにおいて、
angleX = Mathf.Clamp (angleX, MinimumX, MaximumX);
の行以外、全てわからないのですが、なぜ角度制限ができてしまうのでしょうか?
q.xをq.wで割るという所から分からないです。
C#
1 Quaternion ClampRotationAroundXAxis(Quaternion q) 2 { 3 q.x /= q.w; 4 q.y /= q.w; 5 q.z /= q.w; 6 q.w = 1.0 f; 7 8 float angleX = 2.0 f * Mathf.Rad2Deg * Mathf.Atan (q.x); 9 10 angleX = Mathf.Clamp (angleX, MinimumX, MaximumX); 11 12 q.x = Mathf.Tan (0.5 f * Mathf.Deg2Rad * angleX); 13 14 return q; 15 }
・質問2。
回転した後に、ClampRotationAroundXAxisで角度制限しているみたいですが、
角度制限はClampRotationAroundXAxisの内部処理のようにクォータニオンの成分に分けて処理しないと
角度制限できないのでしょうか?
他の方法があれば教えていただきたいです。
また、他の方法があったとしても、ClampRotationAroundXAxisのような方法で処理するメリットとかあるのでしょうか?
C#
1 float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity; 2 float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity; 3 4 m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f); 5 m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f); 6 7 if(clampVerticalRotation) 8 m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);
試したこと
クォータニオンの成分に関しては全くわからなかったので、下記サイト等を調べました。
https://qiita.com/edo_m18/items/5db35b60112e281f840e
https://kamino.hatenablog.com/entry/rotation_expressions
下記のように分解されるのはわかりましたが、
(わかったというよりも丸暗記するしかないということで納得しましたが)
C#
1x=nxsin(θ/2) 2y=nysin(θ/2) 3z=nzsin(θ/2) 4w=cos(θ/2)
上記と下記の関連性がわかりません。下記は上記と無関係なのでしょうか?
q.x /= q.w; q.y /= q.w; q.z /= q.w; q.w = 1.0f;

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/23 02:44 編集
2019/08/23 09:36
退会済みユーザー
2019/08/23 11:48
2019/08/23 14:04
退会済みユーザー
2019/08/23 15:55