弹跳球。让它在高峰时减速

时间:2013-11-16 01:03:40

标签: graphics 3d x3d x3dom

我在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>

1 个答案:

答案 0 :(得分:0)

使用'真实'物理学。

  1. 球有参数

    • 加速a(ax,ay,az) [m / s ^ 2] ......这是所有驱动球的力量除以质量的总和
    • velocity v(vx,vy,vz) [m / s] ...实际速度=加速度的整合v += a * dt
    • 位置p(x,y,z) [m] ...实际位置=速度p += v * dt
    • 的整合
    • radius r [m]
    • 质量m [kg]
    • dt [s] ...迭代步骤(更新时间)

    初始化a,v(0,0,0)p开始位置

  2. 应用重力,摩擦,碰撞

    • 重力,例如g(gx=0,gy=-9.81,gz=0)
    • 摩擦f2 = -(|v|^2)*c2 * (v/|v|) ......在气体中
    • 摩擦f3 = -(|v|^3)*c3 * (v/|v|) ......液体

    如果在交叉碰撞边界之前和之后的位置通过冲击法线反映速度*碰撞系数<= 1,那么如果无法跨越边界,您也可以反映位置。

  3. 将所有内容放在一起使用dt间隔的定时器/更新代码

    a =g+(f2+f3+(driving force))/m
    v+=a*dt
    p+=v*dt
    test_collisions()
    redraw()
    
  4. 手动更改职位

    只需将p(x,y,z)设置为新位置,也可以设置v=(0,0,0)停止球