Skip to content

Commit 3d8139f

Browse files
authored
CMCL-710: 3rd person gimbal lock fix (#370)
* eliminate 3rdpersonFollow console spam when looking up or down * revert a too-aggressive change * too aggressive again
1 parent 6bbd422 commit 3d8139f

File tree

3 files changed

+11
-9
lines changed

3 files changed

+11
-9
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1515
- Regression fix: compilation errors when physics module is not present.
1616
- GameObjects created with Gameobject menu items now follow Unity naming conventions.
1717
- Regression fix: virtual cameras no longer forget that they are targeting groups on domain reload.
18+
- Moved Cinemachine tools into the main Tools overlay (2022.1+), moved Freelook rig selection to a separate overlay, updated icons to support light and dark themes.
19+
- Bugfix: 3rdPersonFollow logged console messages when looking straight up or down.
1820
- BugFix: InputProvider no longer causes a tiny gc alloc every frame.
19-
- Moved Cinemachine tools into the main Tools overlay (2022.1+), moved Freelook rig selection to a separate overlay, updated icons to support light and dark themes
2021

2122

2223
## [2.9.0-pre.1] - 2021-10-26

Editor/Editors/Cinemachine3rdPersonFollowEditor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ void DrawSceneTools()
6868
out var armPosition);
6969
var followTargetRotation = thirdPerson.FollowTargetRotation;
7070
var targetForward = followTargetRotation * Vector3.forward;
71+
var heading = Cinemachine3rdPersonFollow.GetHeading(
72+
followTargetRotation, thirdPerson.VirtualCamera.State.ReferenceUp);
7173

7274
EditorGUI.BeginChangeCheck();
7375
// shoulder handle
74-
var heading = Cinemachine3rdPersonFollow.GetHeading(
75-
targetForward, thirdPerson.VirtualCamera.State.ReferenceUp);
7676
var sHandleMinId = GUIUtility.GetControlID(FocusType.Passive); // TODO: KGB workaround until id is exposed
7777
var newShoulderPosition = Handles.PositionHandle(shoulderPosition, heading);
7878
var sHandleMaxId = GUIUtility.GetControlID(FocusType.Passive); // TODO: KGB workaround until id is exposed

Runtime/Components/Cinemachine3rdPersonFollow.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void PositionCamera(ref CameraState curState, float deltaTime)
186186
var targetPos = FollowTargetPosition;
187187
var targetRot = FollowTargetRotation;
188188
var targetForward = targetRot * Vector3.forward;
189-
var heading = GetHeading(targetForward, up);
189+
var heading = GetHeading(targetRot, up);
190190

191191
if (deltaTime < 0)
192192
{
@@ -234,8 +234,7 @@ public void GetRigPositions(out Vector3 root, out Vector3 shoulder, out Vector3
234234
{
235235
var up = VirtualCamera.State.ReferenceUp;
236236
var targetRot = FollowTargetRotation;
237-
var targetForward = targetRot * Vector3.forward;
238-
var heading = GetHeading(targetForward, up);
237+
var heading = GetHeading(targetRot, up);
239238
root = m_PreviousFollowTargetPosition;
240239
GetRawRigPositions(root, targetRot, heading, out shoulder, out hand);
241240
#if CINEMACHINE_PHYSICS
@@ -244,10 +243,12 @@ public void GetRigPositions(out Vector3 root, out Vector3 shoulder, out Vector3
244243
#endif
245244
}
246245

247-
internal static Quaternion GetHeading(Vector3 targetForward, Vector3 up)
246+
internal static Quaternion GetHeading(Quaternion targetRot, Vector3 up)
248247
{
249-
var planeForward = targetForward.ProjectOntoPlane(up);
250-
planeForward = Vector3.Cross(up, Vector3.Cross(planeForward, up));
248+
var targetForward = targetRot * Vector3.forward;
249+
var planeForward = Vector3.Cross(up, Vector3.Cross(targetForward.ProjectOntoPlane(up), up));
250+
if (planeForward.AlmostZero())
251+
planeForward = Vector3.Cross(targetRot * Vector3.right, up);
251252
return Quaternion.LookRotation(planeForward, up);
252253
}
253254

0 commit comments

Comments
 (0)