50
Анимируем объекты с использованием физики в JavaScript Иванова Елена @liveldi90 Фронтенд разработчик Astroshock 25 июня 2015

Анимируем объекты с использованием физики в JavaScript

Embed Size (px)

Citation preview

Page 1: Анимируем объекты с использованием физики в JavaScript

Анимируем  объекты    с  использованием  физики    

в  JavaScript  

Иванова  Елена    @liveldi90  

Фронтенд  разработчик  Astroshock  

25  июня  2015  

Page 2: Анимируем объекты с использованием физики в JavaScript

СОДЕРЖАНИЕ  

Конструкторы  Движение  Сила  трения  

Ускорение  и  прыжки  

Пружины  и  колебания  

Анимация  

Page 3: Анимируем объекты с использованием физики в JavaScript

АНИМАЦИЯ  

Page 4: Анимируем объекты с использованием физики в JavaScript

4  /  42  

Page 5: Анимируем объекты с использованием физики в JavaScript

5  /  42  

Page 6: Анимируем объекты с использованием физики в JavaScript

setTimeout(func,  1000/fps);  setInterval(func,  1000/fps);  requestAnimaponFrame(func);  

6  /  42  

Page 7: Анимируем объекты с использованием физики в JavaScript

6  /  42  

setTimeout(func,  1000/fps);  setInterval(func,  1000/fps);  requestAnimaponFrame(func);  

Page 8: Анимируем объекты с использованием физики в JavaScript

var  t0  =  0,  dt;  var  kSmothing  =  0.001;    funcpon  onTimer()  {              var  t1  =  new  Date().getTime();              dt  =  t1  —  t0;              t0  =  t1;        //  Меняем  кадры  

}  

7  /  42  

Page 9: Анимируем объекты с использованием физики в JavaScript

КОНСТРУКТОРЫ  

Page 10: Анимируем объекты с использованием физики в JavaScript

ОБЪЕКТ  —  параметры  var  Obj  =  funcpon  (ops)  {                  this.$el            //  Доступ  к  элементу                  this.mass    //  Масса    

               this.x                  //  Позиция  x,  y                  this.y    

               this.vx              //  Cкорость  по  x,  y                  this.vy        …  };  

9  /  42  

Page 11: Анимируем объекты с использованием физики в JavaScript

ОБЪЕКТ  —  методы    

Obj.prototype.pos    Obj.prototype.velo  

10  /  42  

Page 12: Анимируем объекты с использованием физики в JavaScript

ВЕКТОР  —  параметры  

var  Vector  =  funcpon  (x,  y)  {                this.x  =  x;                this.y  =  y;  };  

11  /  42  

Page 13: Анимируем объекты с использованием физики в JavaScript

ВЕКТОР  —  методы  

Vector.prototype.length()  Vector.prototype.add(vec)  Vector.prototype.subtract(vec)  Vector.prototype.mulpply(k)  Vector.prototype.divide(k)      

12  /  42  

Page 14: Анимируем объекты с использованием физики в JavaScript

ВЕКТОР  —  методы  

Vector.prototype.addScaled  =      funcpon  (vec,  k)  {  

                 return  new  Vector(            this.x  +  k  *  vec.x,    

           this.y  +  k  *  vec.y);    };  

13  /  42  

Page 15: Анимируем объекты с использованием физики в JavaScript

ДВИЖЕНИЕ  

Page 16: Анимируем объекты с использованием физики в JavaScript

15  /  42  

Page 17: Анимируем объекты с использованием физики в JavaScript

16  /  42  

Page 18: Анимируем объекты с использованием физики в JavaScript

obj.pos  =  new  Vector(10,  0);  obj.velo  =  new  Vector(60,  0);  

17  /  42  

Page 19: Анимируем объекты с использованием физики в JavaScript

obj.pos  =  new  Vector(10,  0);  obj.velo  =  new  Vector(60,  0);    funcpon  move()  {    obj.pos  =  obj.pos.addScaled(obj.velo,  dt);  

}  

17  /  42  

Page 20: Анимируем объекты с использованием физики в JavaScript

СИЛА  ТРЕНИЯ  

Page 21: Анимируем объекты с использованием физики в JavaScript

КИНЕТИЧЕСКАЯ  ЭНЕРГИЯ  19  /  42  

Page 22: Анимируем объекты с использованием физики в JavaScript

МОЩНОСТЬ  

СИЛА  ТРЕНИЯ  

20  /  42  

Page 23: Анимируем объекты с использованием физики в JavaScript

ИЗМЕНЕНИЕ  КИНЕТИЧЕСКОЙ  ЭНЕРГИИ  

21  /  42  

Page 24: Анимируем объекты с использованием физики в JavaScript

var  displ  =  obj.pos.subtract(obj.pos0);  obj.velo  =  displ.divide((t1  —  t0)  *  kSmoothing);    ke  =  new  Vector(        0.5  *  obj.mass  *  obj.vx  *  obj.vx,  

                               0.5  *  obj.mass  *  obj.vy  *  obj.vy);  

НАЧАЛЬНЫЕ  РАСЧЕТЫ  22  /  42  

Page 25: Анимируем объекты с использованием физики в JavaScript

var  powerLoss  =  new  Vector(          powerLossFactor  *  obj.vx  *  obj.vx  *  dt,  

                                         powerLossFactor  *  obj.vy  *  obj.vy  *  dt);    ke  =  ke.subtract(powerLoss);  

ОБНОВЛЕНИЕ  КИНЕТИЧЕСКОЙ  ЭНЕРГИИ  

23  /  42  

Page 26: Анимируем объекты с использованием физики в JavaScript

obj.velo  =  new  Vector(      Math.sqrt(2  *  ke.x  /  obj.mass),        Math.sqrt(2  *  ke.y  /  obj.mass)  

);  

ОБНОВЛЕНИЕ  СКОРОСТИ  24  /  42  

ОБНОВЛЕНИЕ  ПОЗИЦИИ  

obj.pos  =  obj.pos.addScaled(obj.velo,  dt);  

Page 27: Анимируем объекты с использованием физики в JavaScript

25  /  42  

Page 28: Анимируем объекты с использованием физики в JavaScript

ДОБАВЛЕНИЕ  МОЩНОСТИ  

if  (applyThrust)  {            ke  =  ke.add(new  Vector(                powerApplied  *  dt,                  powerApplied  *  dt)            );                  

}  

26  /  42  

Page 29: Анимируем объекты с использованием физики в JavaScript

УСКОРЕНИЕ    И  ПРЫЖКИ  

Page 30: Анимируем объекты с использованием физики в JavaScript

Сила    сопротивления  (D)  

Гравитация  (W)  

УСКОРЕНИЕ  28  /  42  

Page 31: Анимируем объекты с использованием физики в JavaScript

УСКОРЕНИЕ  29  /  42  

Page 32: Анимируем объекты с использованием физики в JavaScript

30  /  42  

obj.force  =  new  Vector(0,  obj.mass  *  g  —  k  *  obj.vy);  

obj.acc  =  force.divide(obj.mass);  

РАСЧЕТ  СИЛЫ  

ОБНОВЛЕНИЕ  УСКОРЕНИЯ  

Page 33: Анимируем объекты с использованием физики в JavaScript

31  /  42  

obj.velo  =  obj.velo.addScaled(obj.acc,  dt);  

obj.pos  =  obj.pos.addScaled(obj.velo,  dt);  

ОБНОВЛЕНИЕ  СКОРОСТИ  

ОБНОВЛЕНИЕ  ПОЗИЦИИ  

Page 34: Анимируем объекты с использованием физики в JavaScript

УДАР  О  ПОВЕРХНОСТЬ  32  /  42  

Page 35: Анимируем объекты с использованием физики в JavaScript

33  /  42  

ЗАЛИПАНИЯ  

Page 36: Анимируем объекты с использованием физики в JavaScript

34  /  42  

floor  =  new  Vector(0,  winH  —  floorH);    var  displ  =  floor.subtract(obj.pos);  if  (displ.y  —  obj.radius  <=  0)  {                    obj.y  =  floor.y  —  obj.radius;                    obj.vy  *=  —vfac;  }    

ПРОВЕРКА  УДАРА  

Page 37: Анимируем объекты с использованием физики в JavaScript

34  /  42  

floor  =  new  Vector(0,  winH  —  floorH);    var  displ  =  floor.subtract(obj.pos);  if  (displ.y  —  obj.radius  <=  0)  {                    obj.y  =  floor.y  —  obj.radius;                    obj.vy  *=  —vfac;  }    

ПРОВЕРКА  УДАРА  

Page 38: Анимируем объекты с использованием физики в JavaScript

34  /  42  

floor  =  new  Vector(0,  winH  —  floorH);    var  displ  =  floor.subtract(obj.pos);  if  (displ.y  —  obj.radius  <=  0)  {                    obj.y  =  floor.y  —  obj.radius;                    obj.vy  *=  —vfac;  }    

ПРОВЕРКА  УДАРА  

Page 39: Анимируем объекты с использованием физики в JavaScript

ПРУЖИНЫ    И  КОЛЕБАНИЯ  

Page 40: Анимируем объекты с использованием физики в JavaScript

36  /  42  

Page 41: Анимируем объекты с использованием физики в JavaScript

37  /  42  

ПРОСТОЕ  ГАРМОНИЧЕСКОЕ  КОЛЕБАНИЕ  

Закон  Роберта  Гука  

Page 42: Анимируем объекты с использованием физики в JavaScript

Закон  Гука   Второй  закон  Ньютона  

УСКОРЕНИЕ  38  /  42  

Page 43: Анимируем объекты с использованием физики в JavaScript

39  /  42  

var  displ  =  obj.pos.subtract(center);  var  restoring  =  displ.mulpply(—kSpring);  var  damping  =  obj.velo.mulpply(—kDamping);    obj.force  =  Vector.add([restoring,  damping]);  

РАСЧЕТ  СИЛЫ  

Page 44: Анимируем объекты с использованием физики в JavaScript

40  /  42  

Page 45: Анимируем объекты с использованием физики в JavaScript

41  /  42  

cursorForce  =  new  Vector(0,  0);    if  (cursorPos.x  >=  0)  {  

 displCursor  =  obj.pos.subtract(cursorPos);    cursorDist  =  displCursor.length();  

   if  (cursorDist  >  1  &&    

cursorDist  <=  cursorForceZoomed)  {                    var  func  =  cursorForceZoomed  /  (cursorDist  *  cursorDist  )      cursorForce  =  displCursor.mulpply(func);  

             }  }  

РАСЧЕТ  СИЛЫ  КУРСОРА  

Page 46: Анимируем объекты с использованием физики в JavaScript

41  /  42  

cursorForce  =  new  Vector(0,  0);    if  (cursorPos.x  >=  0)  {  

 displCursor  =  obj.pos.subtract(cursorPos);    cursorDist  =  displCursor.length();  

   if  (cursorDist  >  1  &&    

cursorDist  <=  cursorForceZoomed)  {                    var  func  =  cursorForceZoomed  /  (cursorDist  *  cursorDist  )      cursorForce  =  displCursor.mulpply(func);  

             }  }  

РАСЧЕТ  СИЛЫ  КУРСОРА  

Page 47: Анимируем объекты с использованием физики в JavaScript

41  /  42  

cursorForce  =  new  Vector(0,  0);    if  (cursorPos.x  >=  0)  {  

 displCursor  =  obj.pos.subtract(cursorPos);    cursorDist  =  displCursor.length();  

   if  (cursorDist  >  1  &&    

cursorDist  <=  cursorForceZoomed)  {                    var  func  =  cursorForceZoomed  /  (cursorDist  *  cursorDist  )      cursorForce  =  displCursor.mulpply(func);  

             }  }  

РАСЧЕТ  СИЛЫ  КУРСОРА  

Page 48: Анимируем объекты с использованием физики в JavaScript

41  /  42  

cursorForce  =  new  Vector(0,  0);    if  (cursorPos.x  >=  0)  {  

 displCursor  =  obj.pos.subtract(cursorPos);    cursorDist  =  displCursor.length();  

   if  (cursorDist  >  1  &&    

cursorDist  <=  cursorForceZoomed)  {                    var  func  =  cursorForceZoomed  /  (cursorDist  *  cursorDist  )      cursorForce  =  displCursor.mulpply(func);  

             }  }  

РАСЧЕТ  СИЛЫ  КУРСОРА  

Page 49: Анимируем объекты с использованием физики в JavaScript

cursorForce  =  new  Vector(0,  0);    if  (cursorPos.x  >=  0)  {  

 displCursor  =  obj.pos.subtract(cursorPos);    cursorDist  =  displCursor.length();  

   if  (cursorDist  >  1  &&    

cursorDist  <=  cursorForceZoomed)  {                    var  func  =  cursorForceZoomed  /  (cursorDist  *  cursorDist  )      cursorForce  =  displCursor.mulpply(func);  

             }  }  

41  /  42  

РАСЧЕТ  СИЛЫ  КУРСОРА  

Page 50: Анимируем объекты с использованием физики в JavaScript

Иванова  Елена    @liveldi90  

 physicsdemos.liveldi.ru