【发布时间】:2011-01-16 16:51:27
【问题描述】:
我有一个草纹理:
我在我的 2d 游戏中使用它。我想通过代码对其进行动画处理,没有任何预定义的动画。
草应该与风相互作用。因此,当风更大时,草应该更多地向需要的一侧弯腰。
我使用正弦函数制作的第一个动画版本,但是这样的动画有点难看,因为草的底部像图片的其他部分一样向左/向右移动。使用 sinusoid 我无法调节图像的弯曲度。
有什么建议吗?
【问题讨论】:
我有一个草纹理:
我在我的 2d 游戏中使用它。我想通过代码对其进行动画处理,没有任何预定义的动画。
草应该与风相互作用。因此,当风更大时,草应该更多地向需要的一侧弯腰。
我使用正弦函数制作的第一个动画版本,但是这样的动画有点难看,因为草的底部像图片的其他部分一样向左/向右移动。使用 sinusoid 我无法调节图像的弯曲度。
有什么建议吗?
【问题讨论】:
这是您可以通过移动像素轻松获得的结果:
虽然可能对您不是很有用,但这里有一个 Mathematica 程序:
f[l_, sh_] := Module[{c = l, k = (Dimensions@l)[[1]]},
For[i = 1, i <= k, i++,
c[[i]] = RotateRight[l[[i]], IntegerPart[(k + 1 - i)/sh]]];
Return[c];]
b = ArrayPad[ImageData@a, {{40}, {40}, {0}}, {1, 1, 1}];
Export["c:\\anim.gif",
{Image@b, Image@f[b, 7],
Image@f[b, 5], Image@f[b, 3],
Image@f[b, 5], Image@f[b, 7], Image@b}, "DisplayDurations" -> .3]
编辑
但是你可以通过应用循环变换来获得更好的效果:
b = Image@ArrayPad[ImageData@a, {{40, 0}, {40}, {0}}, {1, 1, 1}];
f[image_, angleMult_] := ImageForwardTransformation[image, (
fi = ArcTan[Abs[#[[2]]/(#[[1]] - .5)]];
fi1 = angleMult fi (#[[1]]^2 + #[[2]]^2)/2;
{(1/2 - Sin[fi1] #[[2]] - Cos[fi1]/2 +
Cos[fi1] #[[1]]), -Sin[fi1]/2 + Sin[fi1] #[[1]] +
Cos[fi1] #[[2]]}) &]
t = Table[f[b, x], {x, 0, .2, .02}];
t1 = Reverse@t;
Export["c:\\anim.gif", Join[t, t1], "DisplayDurations" -> .15];
Import["c:\\anim.gif", "Animation"]
【讨论】:
a 变量(图像)。我试过:a = Image['path in system.png'] 或 a = Imprt['path.png']。但是第一次我得到了很多错误,第二次我得到了一个静态图像,但仍然有很多错误。
您可以只移动行,例如从底部开始,每 3 行向右移动 1px。
【讨论】:
你是如何显示纹理的?使用广告牌时,您可以操纵广告牌的顶点,甚至对广告牌进行三角测量以获得更多控制。
【讨论】: