In our application we have the option to pause every physics behaviour by setting Time.timeScale = 0; and unpausing it by restoring it to Time.timeScale = 1;. During the pause, CM doesn’t work, which is expected. However, immediately after restoring Time.timeScale to 1, numerous exceptions are thrown:
Assertion failed: Assertion failed on expression: 'CompareApproximately(det, 1.0F, .005f)'
UnityEngine.Quaternion:FromToRotation(Vector3, Vector3)
Cinemachine.Utility.PositionPredictor:PredictPosition(Single) (at Assets/Cinemachine/Base/Runtime/Core/Predictor.cs:64)
Cinemachine.CinemachineComposer:GetLookAtPointAndSetTrackedPoint(Vector3) (at Assets/Cinemachine/Base/Runtime/Components/CinemachineComposer.cs:132)
Cinemachine.CinemachineComposer:PrePipelineMutateCameraState(CameraState&) (at Assets/Cinemachine/Base/Runtime/Components/CinemachineComposer.cs:151)
Cinemachine.CinemachineVirtualCamera:CalculateNewState(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineVirtualCamera.cs:420)
Cinemachine.CinemachineVirtualCamera:UpdateCameraState(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineVirtualCamera.cs:128)
Cinemachine.CinemachineCore:UpdateVirtualCamera(ICinemachineCamera, Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Core/CinemachineCore.cs:237)
Cinemachine.CinemachineCore:UpdateAllActiveVirtualCameras(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Core/CinemachineCore.cs:172)
Cinemachine.CinemachineBrain:UpdateVirtualCameras(UpdateFilter, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineBrain.cs:445)
Cinemachine.CinemachineBrain:LateUpdate() (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineBrain.cs:399)
Assertion failed: Assertion failed on expression: 'fRoot >= Vector3f::epsilon'
UnityEngine.Quaternion:FromToRotation(Vector3, Vector3)
Cinemachine.Utility.PositionPredictor:PredictPosition(Single) (at Assets/Cinemachine/Base/Runtime/Core/Predictor.cs:64)
Cinemachine.CinemachineComposer:GetLookAtPointAndSetTrackedPoint(Vector3) (at Assets/Cinemachine/Base/Runtime/Components/CinemachineComposer.cs:132)
Cinemachine.CinemachineComposer:PrePipelineMutateCameraState(CameraState&) (at Assets/Cinemachine/Base/Runtime/Components/CinemachineComposer.cs:151)
Cinemachine.CinemachineVirtualCamera:CalculateNewState(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineVirtualCamera.cs:420)
Cinemachine.CinemachineVirtualCamera:UpdateCameraState(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineVirtualCamera.cs:128)
Cinemachine.CinemachineCore:UpdateVirtualCamera(ICinemachineCamera, Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Core/CinemachineCore.cs:237)
Cinemachine.CinemachineCore:UpdateAllActiveVirtualCameras(Vector3, Single) (at Assets/Cinemachine/Base/Runtime/Core/CinemachineCore.cs:172)
Cinemachine.CinemachineBrain:UpdateVirtualCameras(UpdateFilter, Single) (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineBrain.cs:445)
Cinemachine.CinemachineBrain:LateUpdate() (at Assets/Cinemachine/Base/Runtime/Behaviours/CinemachineBrain.cs:399)
Look rotation viewing vector is zero
If you’re using a following CM virtual camera utilizing a Transposer and Composer, the camera ends up jittering for 1-2 secs after unpausing due to the exceptions.
My current workaround solution includes the following changes in Predictor.cs:58
Vector3 vel = (m_Velocity.IsEmpty() || !IsValid(m_Velocity.Value())) ? Vector3.zero : m_Velocity.Value();
Vector3 accel = (m_Accel.IsEmpty() || !IsValid(m_Accel.Value())) ? Vector3.zero : m_Accel.Value();
The velocity and acceleration are now also set to Vector3.zero if m_Velocity or m_Accel values are not valid, i.e. their vectors include one float which is infinity or NaN. This is the case after restoring Time.timeScale = 1 (and this could maybe happen in other edge cases too I guess?). Below I added the function:
private bool IsValid(Vector3 v)
{
return !float.IsNaN(v.x) && !float.IsNaN(v.y) && !float.IsNaN(v.z) && !float.IsInfinity(v.x) && !float.IsInfinity(v.y) && !float.IsInfinity(v.z);
}
Hope that this helps someone else out and a similar fix will playback into the next CM version