2013-11-16 2 views
0

Я создал анимацию для прыгающего шара в x3d. Мне просто интересно, как я могу заставить мяч замедлиться на пике его высоты, чтобы сделать его более реалистичным. Заранее спасибо.Bouncing Ball. Замедление на пике высоты

<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

Используйте 'реального' физика для этого.

  1. шар имеет параметры

    • ускорение a(ax,ay,az) [м/с^2] ... это сумма всех сил вождения мяч разделен на его массу
    • скорость v(vx,vy,vz) [м/s] ... фактическая скорость = интеграция ускорения v += a * dt
    • позиция p(x,y,z) [м] ... фактическое положение = интеграция скорости p += v * dt
    • радиус r [м]
    • масса m [кг]
    • dt [с] ... шаг итерации (время обновления)

    INIT начать 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) для остановки мяча

Смежные вопросы