具有FeTurbulences的SVG形状扭曲

时间:2017-03-02 13:57:21

标签: javascript animation svg svg-filters distortion

我的问题很简单:是否可以使用SVG滤镜重现this effect(圆形失真动画)?

我认为将FeTurbulences与FeDisplacementMap一起使用会很有趣,因为它适用于static way。但实际上,我不应该使用哪个属性来使动画更好。

<feTurbulence type="fractalNoise" baseFrequency="0.01" numOctaves="2" result="warp" seed="0" stichTitles="stitch"></feTurbulence>
<feDisplacementMap xChannelSelector="R" yChannelSelector="G" scale="30" in="SourceGraphic" in2="warp" />

如果您有其他解决方案(js库,过滤器等):请不要犹豫。我对所有解决方案持开放态度;)

感谢您的考虑。

2 个答案:

答案 0 :(得分:2)

这就是你做这种过滤的方法。 baseFrequency控制失真的粒度,比例控制位移的大小,Animate中的dur控制速度。我已经为比例设置了动画,并添加了一个阴影,以便更好地匹配原始。

  <svg width="800px" height="600px">
  <defs>
<filter id="distort">
  <feTurbulence baseFrequency=".015" type="fractalNoise"/>
  <feColorMatrix type="hueRotate" values="0">
    <animate attributeName="values" from="0" to="360" dur="1s" repeatCount="indefinite"/>
  </feColorMatrix>
  <feDisplacementMap in="SourceGraphic" xChannelSelector="R" yChannelSelector="B" scale="20">
    <animate attributeName="scale" values="0;20;50;0" dur="5s" repeatCount="indefinite"/>
    </feDisplacementMap>
  <feGaussianBlur stdDeviation="3"/>
  <feComponentTransfer result="main">
    <feFuncA type="gamma" amplitude="50" exponent="5"/>
  </feComponentTransfer>
  
  <feColorMatrix type="matrix" values="0 0 0 0 0 
                                       0 0 0 0 0
                                       0 0 0 0 0
                                       0 0 0 1 0"/>
  <feGaussianBlur stdDeviation="10"/>
  <feComposite operator="over" in="main"/>

</filter>
  </defs>
  <circle filter="url(#distort)" cx="200" cy="200" r="150" fill="red"/>
</svg>

答案 1 :(得分:0)

我曾经创造过类似的效果,但没有使用过滤器。我基本上做的是:

  1. 为»star«形状创建坐标,或将常规Polygon创建为数组
  2. 为这些坐标设置动画,使它们移动,但不会过度扭曲整体星形,
  3. 使用Catmul-Rom算法平滑边缘并将结果转换回贝塞尔路径数据并将其应用于<path />
  4. 在生成的路径上应用高斯模糊