//计算下一个四元数值 其实是转换成欧拉角进行计算 public static Quaternion getNextQuaternionValue_new(Quaternion now, int propertyIndex, FduMultiAttributeObserverBase observer) { var dts = observer.getDataTransmitStrategy(); if (dts == null || !dts.GetType().Equals(typeof(FduDTS_EveryNFrame))) { return(Quaternion.identity); } FduDTS_EveryNFrame dtsN = (FduDTS_EveryNFrame)dts; try { FduDTS_EveryNFrame.InterpolationOption interOp = dtsN.getInterPolationOption(); FduDTS_EveryNFrame.ExtrapolationOption extraOp = dtsN.getExtrapolationOption(); int interval = dtsN.getInterval(); int cur = dtsN.getCurFrame(); Vector3 offset = Vector3.zero; Quaternion lastValue = (Quaternion)observer.getCachedProperty_lastElement(propertyIndex); Vector3 eulerValue = lastValue.eulerAngles; if (extraOp != FduDTS_EveryNFrame.ExtrapolationOption.Disable) { int count = observer.getCachedProperytyCount(propertyIndex); if (count >= 2) { if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedEarliest) { offset = (eulerValue - ((Quaternion)observer.getCachedProperty_firstElement(propertyIndex)).eulerAngles) / (count - 1.0f); } else if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedLatest) { offset = (eulerValue - ((Quaternion)observer.getCachedProperty_atArrayIndex(propertyIndex, count - 2)).eulerAngles); } } } eulerValue = eulerValue + offset; if (interOp == FduDTS_EveryNFrame.InterpolationOption.Disable) { return(Quaternion.Euler(eulerValue)); } else if (interOp == FduDTS_EveryNFrame.InterpolationOption.FixedStep || interOp == FduDTS_EveryNFrame.InterpolationOption.EstimateStep) { if ((interval - cur + 1) > 0) { var res = Quaternion.Lerp(now, Quaternion.Euler(eulerValue), 1.0f / (interval - cur + 1)); return(res); } else { return(Quaternion.Euler(eulerValue)); } } else if (interOp == FduDTS_EveryNFrame.InterpolationOption.Lerp) { return(Quaternion.Lerp(now, Quaternion.Euler(eulerValue), Time.deltaTime * dtsN.getLerpSpeed())); } return(Quaternion.Euler(eulerValue)); } catch (System.Exception) { return(Quaternion.identity); } }
//计算下一个Float值 public static float getNextFloatValue_new(float now, int propertyIndex, FduMultiAttributeObserverBase observer) { var dts = observer.getDataTransmitStrategy(); if (dts == null || !dts.GetType().Equals(typeof(FduDTS_EveryNFrame))) { return(0); } FduDTS_EveryNFrame dtsN = (FduDTS_EveryNFrame)dts; try { FduDTS_EveryNFrame.InterpolationOption interOp = dtsN.getInterPolationOption(); FduDTS_EveryNFrame.ExtrapolationOption extraOp = dtsN.getExtrapolationOption(); int interval = dtsN.getInterval(); int cur = dtsN.getCurFrame(); float offset = 0; float lastValue = (float)observer.getCachedProperty_lastElement(propertyIndex); if (extraOp != FduDTS_EveryNFrame.ExtrapolationOption.Disable) { int count = observer.getCachedProperytyCount(propertyIndex); if (count >= 2) { if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedEarliest) { offset = (lastValue - (float)observer.getCachedProperty_firstElement(propertyIndex)) / (count - 1); } else if (extraOp == FduDTS_EveryNFrame.ExtrapolationOption.CachedLatest) { offset = (lastValue - (float)observer.getCachedProperty_atArrayIndex(propertyIndex, count - 2)); } } } lastValue = lastValue + offset; if (interOp == FduDTS_EveryNFrame.InterpolationOption.Disable) { return(lastValue); } else if (interOp == FduDTS_EveryNFrame.InterpolationOption.EstimateStep) { int count = observer.getCachedProperytyCount(propertyIndex); if (count >= 2) { float step = ((lastValue - offset) - (float)observer.getCachedProperty_atArrayIndex(propertyIndex, count - 2)) / interval; return(now + step); } return(lastValue); } else if (interOp == FduDTS_EveryNFrame.InterpolationOption.FixedStep) { if ((interval - cur + 1) > 0) { float res = Mathf.Lerp(now, lastValue, 1.0f / (interval - cur + 1)); return(res); } else { return(lastValue); } } else if (interOp == FduDTS_EveryNFrame.InterpolationOption.Lerp) { return(Mathf.Lerp(now, lastValue, Time.deltaTime * dtsN.getLerpSpeed())); } return(lastValue); } catch (System.Exception) { return(0); } }