1

我想做这个动画 - 海平面上升,吞没了一座有坑的小山。当水退去时,其中一些会留在口袋里,当水位上升时,它会再次变成一。这个动画无限期地继续。现在我尝试使用两种方法来做到这一点,

1) 用海水中的水流抽清池中的水。ctx.bezierCurveTo(x1,y1,x2,y2,end_x,end_y); 我随着水流改变了第一个和第二个控制点,使底座从小平面变为球形,反之亦然。但是并不光滑,而且第二个坑有不规则的底部,所以不可能。

2)我在需要的口袋里装满了水,并设置了不透明度,这样口袋里的水在被淹没时会与海水混合。同样,这种方法并没有给出平滑的外观。

它应该是这样的:

https://s3.postimg.org/7f430a1ir/Picture1.jpg

基本图像是画布的背景,我只需要控制水流。

请建议该怎么做。

4

2 回答 2

0

您可以使用合成让海水无缝侵入您的山上

特别是“源出”合成允许您仅在不与任何现有内容重叠的地方绘制新内容。

因此,“源出”合成将允许您仅在不与现有山重叠的地方绘制新的海水。

当水位上升时:

  1. 透明帆布
  2. set globalCompositeOperation="source-over" // 默认,新图纸会透支
  3. 画你的山
  4. set globalCompositeOperation="source-out" // 新的海水不会透支现有的山脉
  5. 画出上升的海水
  6. 增加海水的高度
  7. 重复#1,直到你的海水达到所需的高度

当水落下时:

  1. 透明帆布
  2. set globalCompositeOperation="source-over" // 默认,新图纸会透支
  3. 画你的山
  4. set globalCompositeOperation="source-out" // 新的海水不会透支现有的山脉
  5. 只在你山的坑里汲取残留的海水
  6. 画下落下的海水
  7. 降低海水的高度
  8. 重复#1,直到你的海水达到所需的高度
于 2014-02-05T17:19:10.077 回答
0

经过深思熟虑,找到了一个两步法。

第一步>>

1)在海中取水(Destination) 2)设置 ctx.globalCompositeOperation="destination-out"; 3) 抽取池水(来源)

这将删除与 dest 重叠的部分源。从而创造出具有中空空间(透明度)的海水来代替水池。现在这个有洞的图像变成了目标。我必须在其上仅绘制池水以保持水的稠度的图像。

第二步>>

1) 设置 ctx.globalCompositeOperation="destination-atop"; 2) 抽取池水(来源)

这将绘制 dest。只有目的地。和源重叠,即当目标。在空心区域创建带有孔的图像(透明代替水池)和水池重叠海水。需要注意的一点 - 池水就像海水的一个子集,所以我不必担心要创建的池水(源),因为它与“目的地顶部”一样。

于 2014-02-06T21:35:57.730 回答