主题开始的问题:如何动画网球弹跳
在这个问题中,反弹是垂直的
<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="200" height="200" viewBox="0 0 200 200" preserveAspectRatio="xMinYMin meet" style="border:1px solid" >
<image xlink:href="https://isstatic.askoverflow.dev/hXyA5.png" x="82" width="25px" height="25px" >
<animateTransform id="anT"
attributeName="transform"
type="translate"
dur="3s"
begin="svg1.click+0.5s;anT.end+1s"
values="
0,0;
0,168;
0,84;
0,168;
0,126;
0,168;
0,148;
0,168;
0,158;
0,168;
0,163;
0,168;
0,166;
0,168;
"
keyTimes="0;0.066;0.13;0.198;0.264;0.33;0.396;0.462;0.528;0.594;0.66;0.726;0.792;1"
repeatCount="1"
fill="freeze"
restart="whenNotActive" />
</image>
<polyline points="5,193 194,193" stroke="silver" stroke-width="4" />
</svg>
这个问题涉及具有不同高度和长度偏移的反弹。
很明显可以在矢量编辑器中画出小球的轨迹,如图,然后沿着轨迹实现运动,如上例。
但是很难实现运动和速度的不均匀性。

期待你的下一个问题,我也让它旋转:
我不擅长JavaScript,所以我会写一些伪代码。
如您所知,球的回弹(又名抛物线)垂直由二次方程描述,水平由一个均匀方程描述,即:
vY- 初始垂直速度,vX- 初始水平速度,t- 时间,G- 重力加速度,对于地球来说是9.81 м/c^2(月球低 6 倍 - 1.62 m/s^2)。此外,在到达地面时(
y=0),球再次反弹,并且每次跳跃都会分别损失一定比例的速度/能量,公式如下哪里
k是反弹因子(大约〜90%),N是反弹的数量。仍然需要将其编程到您的动画中,这显然不会成为问题。
PS 这绝对比抛物线仿真更好
cos()——顺便说一下,在计算速度方面更快,而且在物理上更合理解决方案 svg 微笑
球的轨迹是根据矢量编辑器 Inkscape 中问题中的图片创建的
沿着我使用的轨迹动画运动 - animateMotion
CSS 解决方案
CSS 动画可以更好地接近这一点。你需要:
然后你需要根据时长正确计算延迟(前一个动画延迟 + 2 * 前一个动画时长)。
主要技巧是使用隔行扫描并运行每个动画两次会给你一个镜像效果和一个完美的抛物线曲线(其中一半由贝塞尔曲线定义)。
添加水平移动:
来自成员 @Temani Afif的答案的松散翻译 。