Прыгающий мяч. Замедление на пике высоты

Я создал анимацию прыгающего мяча в 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>


person DavidRob1993    schedule 16.11.2013    source источник


Ответы (1)


Используйте для этого «настоящую» физику.

  1. мяч имеет параметры

    • acceleration a(ax,ay,az) [m/s^2]... this is sum of all forces driving ball divided by its mass
    • скорость v(vx,vy,vz) [м/с]... фактическая скорость = интегрирование ускорения v += a * dt
    • положение p(x,y,z) [м]... фактическое положение = интегрирование скорости p += v * dt
    • радиус r [м]
    • масса m [кг]
    • dt [с]... шаг итерации (время обновления)

    инициализировать начальные значения a,v в (0,0,0) и p в начальную позицию

  2. применить гравитацию, трение, столкновение

    • gravity for example 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), чтобы остановить мяч

person Spektre    schedule 16.11.2013