我在x3d中创建了一个弹跳球动画。我很好奇我怎么能让球在其高度的顶峰处减速以使其看起来更逼真。提前谢谢。
<X3D profile="interactive">
<Scene>
<Background skyColor='0.5 0.5 1'/>
<Transform DEF="Ball" translation="0 1 0" >
<TouchSensor DEF="Touch"/>
<Shape>
<Appearance>
<Material diffuseColor="1 0 0 "/>
</Appearance>
<Sphere radius='1'/>
</Shape>
</Transform>
<TimeTrigger DEF="Trigger"/>
<TimeSensor DEF="Clock" loop="false" cycleInterval="5" />
<PositionInterpolator DEF="Position" key="0.0 0.5 1.0" keyValue="0 1 0 0 5 0 0 1 0"/>
<ROUTE fromNode="Clock" fromField="fraction_changed" toNode="Position" toField="set_fraction"/>
<ROUTE fromNode="Position" fromField="value_changed" toNode="Ball" toField="set_translation"/>
<ROUTE fromNode="Touch" fromField="isActive" toNode="Trigger" toField="set_boolean"/>
<ROUTE fromNode="Trigger" fromField="triggerTime" toNode="Clock" toField="startTime"/>
</Scene>
答案 0 :(得分:0)
使用'真实'物理学。
球有参数
a(ax,ay,az)
[m / s ^ 2] ......这是所有驱动球的力量除以质量的总和v(vx,vy,vz)
[m / s] ...实际速度=加速度的整合v += a * dt
p(x,y,z)
[m] ...实际位置=速度p += v * dt
r
[m] m
[kg] dt
[s] ...迭代步骤(更新时间)初始化a,v
值(0,0,0)
和p
开始位置
应用重力,摩擦,碰撞
g(gx=0,gy=-9.81,gz=0)
f2 = -(|v|^2)*c2 * (v/|v|)
......在气体中f3 = -(|v|^3)*c3 * (v/|v|)
......液体如果在交叉碰撞边界之前和之后的位置通过冲击法线反映速度*碰撞系数<= 1,那么如果无法跨越边界,您也可以反映位置。
将所有内容放在一起使用dt
间隔的定时器/更新代码
a =g+(f2+f3+(driving force))/m
v+=a*dt
p+=v*dt
test_collisions()
redraw()
手动更改职位
只需将p(x,y,z)
设置为新位置,也可以设置v=(0,0,0)
停止球