/// <summary>Get the signal that a listener at a given position would perceive</summary>
 /// <param name="listenerPosition">The listener's position in world space</param>
 /// <param name="use2D">True if distance calculation should ignore Z</param>
 /// <param name="pos">The position impulse signal</param>
 /// <param name="rot">The rotation impulse signal</param>
 /// <returns>true if non-trivial signal is returned</returns>
 public bool GetDecayedSignal(
     Vector3 listenerPosition, bool use2D, out Vector3 pos, out Quaternion rot)
 {
     if (m_SignalSource != null)
     {
         float distance = use2D ? Vector2.Distance(listenerPosition, m_Position)
             : Vector3.Distance(listenerPosition, m_Position);
         float time = Instance.CurrentTime - m_StartTime
                      - distance / Mathf.Max(1, m_PropagationSpeed);
         float scale = m_Envelope.GetValueAt(time) * DistanceDecay(distance);
         if (scale != 0)
         {
             m_SignalSource.GetSignal(time, out pos, out rot);
             pos *= scale;
             rot  = Quaternion.SlerpUnclamped(Quaternion.identity, rot, scale);
             if (m_DirectionMode == DirectionMode.RotateTowardSource && distance > Epsilon)
             {
                 Quaternion q = Quaternion.FromToRotation(Vector3.up, listenerPosition - m_Position);
                 if (m_Radius > Epsilon)
                 {
                     float t = Mathf.Clamp01(distance / m_Radius);
                     q = Quaternion.Slerp(
                         q, Quaternion.identity, Mathf.Cos(Mathf.PI * t / 2));
                 }
                 pos = q * pos;
             }
             return(true);
         }
     }
     pos = Vector3.zero;
     rot = Quaternion.identity;
     return(false);
 }
Exemplo n.º 2
0
 /// <summary>Get the signal that a listener at a given position would perceive</summary>
 /// <param name="pos">The position impulse signal</param>
 /// <param name="rot">The rotation impulse signal</param>
 /// <returns>true if non-trivial signal is returned</returns>
 public bool GetDecayedSignal(Vector3 listenerPosition, out Vector3 pos, out Quaternion rot)
 {
     if (m_SignalSource != null)
     {
         float time     = Time.time - m_StartTime;
         float distance = Vector3.Distance(listenerPosition, m_Position);
         float scale    = m_Envelope.GetValueAt(time) * DistanceDecay(distance);
         m_SignalSource.GetSignal(time, out pos, out rot);
         pos *= scale;
         rot  = Quaternion.SlerpUnclamped(Quaternion.identity, rot, scale);
         return(true);
     }
     pos = Vector3.zero;
     rot = Quaternion.identity;
     return(false);
 }
Exemplo n.º 3
0
 //VirtualCamera用来在流水线中计算State的接口
 public override void MutateCameraState(ref CameraState curState, float deltaTime)
 {
     if (!IsValid || deltaTime < 0)
     {
         return;
     }
     if (ShakeSetting == null || mNoiseTime > ShakeSetting.SignalDuration)
     {
         return;
     }
     mNoiseTime += deltaTime;
     ShakeSetting.GetSignal(mNoiseTime, out Vector3 pos, out Quaternion rot);
     //因为这里是希望实现的是震屏功能,所以需要将ShakeSetting计算出的相机空间中的偏移量,转化为世界坐标中的偏移量。
     //直接用相机的旋转生成的矩阵乘一下就可以了
     shakeMatrix.SetTRS(Vector3.zero, curState.FinalOrientation, Vector3.one);
     //把位置偏移量应用到State上
     curState.PositionCorrection += shakeMatrix.MultiplyPoint(-pos);
     rot = Quaternion.SlerpUnclamped(Quaternion.identity, rot, -1);
     //把旋转偏移量应用到State上
     curState.OrientationCorrection = curState.OrientationCorrection * rot;
 }
Exemplo n.º 4
0
 public void GetSignal(out Vector3 pos, out Quaternion rot)
 {
     ShakeSource.GetSignal(Instance.CurrentTime - StartTime, out pos, out rot);
 }