形状奇特的SVG投影

时间:2012-11-23 05:29:31

标签: svg svg-filters

这是来源:

<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg">
 <g>
  <defs>
    <filter id="f1" x="0" y="0" width="200%" height="200%">
      <feOffset result="offOut" in="SourceGraphic" dx="0" dy="0" />
      <feColorMatrix result="matrixOut" in="offOut" type="matrix"
      values="0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0" />
      <feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <path fill="#E0E0E0" stroke="#FFFFFF" stroke-width="5" d="M 50 50 l 100 0 l -50 86.6 z" filter="url(#f1)"/>
 </g>
</svg>

这就是Firefox看起来的样子: Chrome很相似。

为什么投影不对称?我希望看起来好像照明来自图像的正上方,所以阴影应该是对称的。最终应该看起来像下面的光栅图像:

(对不起,内饰的颜色不匹配,但我稍后会解决。)

1 个答案:

答案 0 :(得分:3)

这更像你想要的吗?

<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg">
 <g>
  <defs>
    <filter id="f1" x="-1" y="-1" width="300%" height="300%">
      <feOffset result="offOut" in="SourceGraphic" dx="0" dy="10" />
      <feColorMatrix result="matrixOut" in="offOut" type="matrix"
      values="0.2 0 0 0 0 0 0.2 0 0 0 0 0 0.2 0 0 0 0 0 1 0" />
      <feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="10" />
      <feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
    </filter>
  </defs>
  <path fill="#E0E0E0" stroke="#FFFFFF" stroke-width="5" d="M 50 50 l 100 0 l -50 86.6 z" filter="url(#f1)"/>
 </g>
</svg>

编辑:说明:

我使滤镜效果区域变大(在width上使用height / <filter>),使其大于形状的边框(宽度的300%)。当然必须重新定位(使用x / y),以便形状位于效果区域的中心。我还使用y上的feOffset属性向下移动了阴影。

附注:正如ErikDahlström在评论中提到的那样,3使用300%代替widthheight使用filterUnits等同于objectBoundingBox隐式设置为-1。对于-100%x上的y和{{1}}也是如此。我混合了两种符号。