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

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

Upload: moscowjs

Post on 04-Aug-2015

226 views

Category:

Software


0 download

TRANSCRIPT

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

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

в  JavaScript  

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

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

25  июня  2015  

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

СОДЕРЖАНИЕ  

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

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

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

Анимация  

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

АНИМАЦИЯ  

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

4  /  42  

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

5  /  42  

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

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

6  /  42  

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

6  /  42  

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

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

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

}  

7  /  42  

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

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

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

ОБЪЕКТ  —  параметры  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", Елена Иванова, MoscowJS 23

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

Obj.prototype.pos    Obj.prototype.velo  

10  /  42  

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

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

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

11  /  42  

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

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

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

12  /  42  

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

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

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

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

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

13  /  42  

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

ДВИЖЕНИЕ  

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

15  /  42  

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

16  /  42  

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

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

17  /  42  

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

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", Елена Иванова, MoscowJS 23

СИЛА  ТРЕНИЯ  

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

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

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

20  /  42  

МОЩНОСТЬ  

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

МОЩНОСТЬ  

СИЛА  ТРЕНИЯ  

20  /  42  

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

МОЩНОСТЬ  

СИЛА  ТРЕНИЯ  

20  /  42  

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

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

21  /  42  

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

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

21  /  42  

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

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 28: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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

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

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

23  /  42  

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

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 30: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

25  /  42  

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

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

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

}  

26  /  42  

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

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

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

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

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

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

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

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

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

30  /  42  

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

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

РАСЧЕТ  СИЛЫ  

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

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

31  /  42  

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

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

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

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

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

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

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

33  /  42  

ЗАЛИПАНИЯ  

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

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 40: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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 41: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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 42: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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

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

36  /  42  

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

37  /  42  

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

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

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

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

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

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

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 47: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

40  /  42  

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

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", Елена Иванова, MoscowJS 23

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 50: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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 51: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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 52: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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 53: "Анимируем объекты с использованием физики в JavaScript", Елена Иванова, MoscowJS 23

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

 physicsdemos.liveldi.ru