【问题标题】:Best way to display flow motion in a SVG?在 SVG 中显示流动运动的最佳方式?
【发布时间】:2012-06-16 16:53:23
【问题描述】:

我想创建一个显示流动流体等内容的网页。为此,我想使用 SVG 图形,其中(重复)运动的开始和停止是通过 JavaScript 控制的。

这个动作可以通过这种手绘 GIF 的方式轻松显示:

但是我怎样才能通过简单的方式在 SVG 中实现这样的外观呢?特别是因为这也必须在拐角处流动,即不仅需要线性运动......

最好已经(半自动)在 Inkscape 中创建...

【问题讨论】:

  • 不确定 SVG,但 nerget.com/fluidSim/this 流体动力学模拟已在 JavaScript 中使用 canvas 实现。如果您查看源代码,则很容易理解。它说它基于 Navier Stokes 方程。您还应该查找格子玻尔兹曼方法。我不是 100% 同意这一点,但我认为格子玻尔兹曼可能是一种逼近 Navier Stokes 方程的离散方法。
  • @Joe:链接错误:here更正
  • @Joe - 感谢您提供这个精彩演示的链接!但我很抱歉,我不得不说这甚至与我的问题没有密切关系 :( 我想显示“假”运动,可以像em-ebook-shop.com/… 那样为管道中的流动设置动画
  • 这个页面有一个number of demos,其中一个是srufaculty.sru.edu/david.dailey/svg/curve.svg。我敢肯定,如果您查看它,您可以确定他们是如何做到的。绕过拐角和形状更具挑战性,但该页面上还有其他一些演示也表明了这一点,另外还有一些在线教程。
  • @Jared Farrish:谢谢,我会开始寻找那里。在这两者之间我还发现了owl3d.com/svg/vsw/articles/vsw_article.html,我认为它也在朝着正确的方向前进……

标签: javascript html svg inkscape


【解决方案1】:

好的,现在我找到了问题“第一”部分的答案,即上部“流程”:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   version="1.1"
   width="202"
   height="32"
   id="svg2">
  <g id="layer1">
    <path
       d="m 1,16 200,0"
       id="path1"
       style="stroke:#000000;stroke-width:30" />
    <path
       d="m 1,16 200,0"
       id="path2"
       style="stroke:#ff0000;stroke-width:20" />
    <path
       d="m 1,16 200,0"
       id="path3"
       style="stroke:#000000;stroke-width:16;stroke-dasharray:48, 48;stroke-dashoffset:10.6" />
  </g>
</svg>

这是在 Inkscape 中创建的(+ 之后手动简化以仅发布相关内容)只需复制一条不同宽度的线,一条非常大的线(id=path1)周围是黑色的,一条大线(@ 987654327@) 用于红色流体和一个小的虚线 (id=path3),稍后将用于动画。

现在剩下要做的就是通过 JavaScript 或 CSS 动画更改 stroke-dashoffset 属性,因为这将移动小条以指示流动。例如:

   <style type="text/css">  
      @keyframes move {  
        from {  stroke-dashoffset: 0;  }  
        to   {  stroke-dashoffset: 96;  }  
      }  
      @-moz-keyframes move {  
        from {  stroke-dashoffset: 0;  }  
        to   {  stroke-dashoffset: 96;  }  
      }  
      @-webkit-keyframes move {  
        from {  stroke-dashoffset: 0;  }  
        to   {  stroke-dashoffset: 96;  }  
      }  
  </style>  

然后在&lt;path id="path3"&gt; 元素中:

  animation-duration: 3s;  
  -moz-animation-duration: 3s;  
  -webkit-animation-duration: 3s;  
  animation-name: move; 
  -moz-animation-name: move; 
  -webkit-animation-name: move; 
  animation-timing-function: linear; 
  -moz-animation-timing-function: linear; 
  -webkit-animation-timing-function: linear; 
  animation-iteration-count: infinite;
  -moz-animation-iteration-count: infinite;
  -webkit-animation-iteration-count: infinite; 

注意:路径可以是任意形状,不需要是直的:)

下流:
通过使用http://owl3d.com/svg/tubefy/articles/article3.html 的想法,我还为“低流量”找到了一个解决方案(更好:解决方法)。这个想法只是多次克隆路径并使用相互绘制的不同颜色的破折号。动画如上。现在可以在以下位置查看两者:http://jsfiddle.net/pXkvD/2

【讨论】:

  • 您可以将此添加为jsfiddle - 有兴趣看看!
  • 吹毛求疵:在无前缀属性之前不应有破折号,例如“-animation-name”应该说“animation-name”。由于前缀非常有趣,为什么不分别为 Opera 和 IE 添加 -o- 和 -ms-。
  • @ErikDahlström 你是绝对正确的。我已经在上面以及现在可以在jsfiddle.net/pXkvD/2 找到的小提琴中更正了它。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多