Ejemplo n.º 1
0
        public void OnUpdate(AnimProxy animProxy, TrailMgr.InterpolationMode interpolationMode)
        {
            if (animProxy && animProxy.IsPlaying(clip))
            {
                RawSample(animProxy, interpolationMode);
            }

            BuildTrailMesh();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 依据clip中固定在武器上的trail对象的移动轨迹获得一系列采样点
        /// </summary>
        void RawSample(AnimProxy animProxy, TrailMgr.InterpolationMode interpolationMode)
        {
            // 动画的播放进度
            float normalizedTime = animProxy.GetNormalizedTime(clip);

            // 遍历设定的每个动画采样时段(注意:时段之间不能有重叠)
            foreach (var clipNormalizedTime in clipNormalizedTimes)
            {
                if (normalizedTime < clipNormalizedTime.startNormalizedTime)
                {
                    // 本时段尚未开始
                    continue;
                }

                if (normalizedTime < clipNormalizedTime.stopNormalizedTime)
                {
                    // 进入指定动画进度
                    if (clipNormalizedTime.sampling == false)
                    {
                        // 开始本时段采样
                        clipNormalizedTime.sampling = true;

                        for (int i = 0; i < _rawSamples.Count; ++i)
                        {
                            SamplePointData.pool.Collect(_rawSamples[i]);
                        }
                        _rawSamples.Clear();
                    }
                }
                else
                {
                    // 离开指定动画进度
                    if (clipNormalizedTime.sampling)
                    {
                        // 停止采样
                        clipNormalizedTime.sampling = false;
                    }
                    continue;
                }

                // 添加原始样本
                SamplePointData raw = SamplePointData.pool.Get();
                raw.pos         = trail.transform.position;
                raw.forward     = trail.transform.forward;
                raw.right       = trail.transform.right;
                raw.sampleTimer = Time.timeSinceLevelLoad;
                _rawSamples.Add(raw);

                // 平滑插值处理
                MakeSmooth(/*Mathf.InverseLerp(clipNormalizedTime.startNormalizedTime,
                            * clipNormalizedTime.stopNormalizedTime, normalizedTime)*/interpolationMode);
            }
        }
Ejemplo n.º 3
0
        void MakeSmooth(TrailMgr.InterpolationMode interpolationMode)
        {
            /*if (_rawSamples.Count < 3)
             * {
             *  return;
             * }*/

            _rawPosList.Clear();
            _samplePosList.Clear();

            foreach (var raw in _rawSamples)
            {
                _rawPosList.Add(raw.pos);
            }

            for (int i = 0; i < _samples.Count; ++i)
            {
                SamplePointData.pool.Collect(_samples[i]);
            }
            _samples.Clear();

            switch (interpolationMode)
            {
            case TrailMgr.InterpolationMode.LINE:
                MakeSamplesByLine();
                break;

            case TrailMgr.InterpolationMode.CATMULLROM:
                // catmullrom样条平滑构建新的样品位置点
                MathTools.GetCatmullRomSplineFullPathPoints(_rawPosList, false, ref _samplePosList, _smoothVal);
                MakeSamplesBySpline();
                break;

            case TrailMgr.InterpolationMode.BEZIER:
                // bezier样条平滑构建新的样品位置点
                MathTools.GetBezierSplineFullPathPoints(_rawPosList, ref _samplePosList, _smoothVal * 10);
                MakeSamplesBySpline();
                break;

            default:
                return;
            }
        }