SlideShare a Scribd company logo
1 of 50
Download to read offline
Анимируем	
  объекты	
  	
  
с	
  использованием	
  физики	
  	
  
в	
  JavaScript	
  
Иванова	
  Елена	
  	
  
@liveldi90	
  
Фронтенд	
  разработчик	
  
Astroshock	
  
25	
  июня	
  2015	
  
СОДЕРЖАНИЕ	
  
Конструкторы	
  
Движение	
  
Сила	
  трения	
  
Ускорение	
  и	
  прыжки	
  
Пружины	
  и	
  колебания	
  
Анимация	
  
АНИМАЦИЯ	
  
4	
  /	
  42	
  
5	
  /	
  42	
  
setTimeout(func,	
  1000/fps);	
  
setInterval(func,	
  1000/fps);	
  
requestAnimaponFrame(func);	
  
6	
  /	
  42	
  
6	
  /	
  42	
  
setTimeout(func,	
  1000/fps);	
  
setInterval(func,	
  1000/fps);	
  
requestAnimaponFrame(func);	
  
var	
  t0	
  =	
  0,	
  dt;	
  
var	
  kSmothing	
  =	
  0.001;	
  
	
  
funcpon	
  onTimer()	
  {	
  
	
  	
  	
  	
  	
  	
  var	
  t1	
  =	
  new	
  Date().getTime();	
  
	
  	
  	
  	
  	
  	
  dt	
  =	
  t1	
  —	
  t0;	
  
	
  	
  	
  	
  	
  	
  t0	
  =	
  t1;	
  
	
  	
  	
  //	
  Меняем	
  кадры	
  
}	
  
7	
  /	
  42	
  
КОНСТРУКТОРЫ	
  
ОБЪЕКТ	
  —	
  параметры	
  
var	
  Obj	
  =	
  funcpon	
  (ops)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.$el	
  	
  	
  	
  	
  	
  //	
  Доступ	
  к	
  элементу	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.mass	
  	
  //	
  Масса	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.x	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  Позиция	
  x,	
  y	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.y	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.vx	
  	
  	
  	
  	
  	
  	
  //	
  Cкорость	
  по	
  x,	
  y	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.vy	
  
	
   	
   	
  …	
  };	
  
9	
  /	
  42	
  
ОБЪЕКТ	
  —	
  методы	
  	
  
Obj.prototype.pos	
  	
  
Obj.prototype.velo	
  
10	
  /	
  42	
  
ВЕКТОР	
  —	
  параметры	
  
var	
  Vector	
  =	
  funcpon	
  (x,	
  y)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  this.x	
  =	
  x;	
  
	
  	
  	
  	
  	
  	
  	
  this.y	
  =	
  y;	
  
};	
  
11	
  /	
  42	
  
ВЕКТОР	
  —	
  методы	
  
Vector.prototype.length()	
  
Vector.prototype.add(vec)	
  
Vector.prototype.subtract(vec)	
  
Vector.prototype.mulpply(k)	
  
Vector.prototype.divide(k)	
  	
  	
  
12	
  /	
  42	
  
ВЕКТОР	
  —	
  методы	
  
Vector.prototype.addScaled	
  =	
  	
  
	
  funcpon	
  (vec,	
  k)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
   	
  return	
  new	
  Vector(	
  
	
   	
   	
   	
   	
  this.x	
  +	
  k	
  *	
  vec.x,	
  	
  
	
   	
   	
   	
   	
   	
  this.y	
  +	
  k	
  *	
  vec.y);	
  
	
  };	
  
13	
  /	
  42	
  
ДВИЖЕНИЕ	
  
15	
  /	
  42	
  
16	
  /	
  42	
  
obj.pos	
  =	
  new	
  Vector(10,	
  0);	
  
obj.velo	
  =	
  new	
  Vector(60,	
  0);	
  
17	
  /	
  42	
  
obj.pos	
  =	
  new	
  Vector(10,	
  0);	
  
obj.velo	
  =	
  new	
  Vector(60,	
  0);	
  
	
  
funcpon	
  move()	
  {	
  
	
  obj.pos	
  =	
  obj.pos.addScaled(obj.velo,	
  dt);	
  
}	
  
17	
  /	
  42	
  
СИЛА	
  ТРЕНИЯ	
  
КИНЕТИЧЕСКАЯ	
  ЭНЕРГИЯ	
  
19	
  /	
  42	
  
МОЩНОСТЬ	
  
СИЛА	
  ТРЕНИЯ	
  
20	
  /	
  42	
  
ИЗМЕНЕНИЕ	
  КИНЕТИЧЕСКОЙ	
  
ЭНЕРГИИ	
  
21	
  /	
  42	
  
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	
  
var	
  powerLoss	
  =	
  new	
  Vector(	
  
	
   	
   	
   	
  powerLossFactor	
  *	
  obj.vx	
  *	
  obj.vx	
  *	
  dt,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  powerLossFactor	
  *	
  obj.vy	
  *	
  obj.vy	
  *	
  dt);	
  
	
  
ke	
  =	
  ke.subtract(powerLoss);	
  
ОБНОВЛЕНИЕ	
  КИНЕТИЧЕСКОЙ	
  
ЭНЕРГИИ	
  
23	
  /	
  42	
  
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);	
  
25	
  /	
  42	
  
ДОБАВЛЕНИЕ	
  МОЩНОСТИ	
  
if	
  (applyThrust)	
  {	
  
	
  	
  	
  	
  	
  ke	
  =	
  ke.add(new	
  Vector(	
  
	
   	
   	
   	
  	
   	
   	
  powerApplied	
  *	
  dt,	
  	
  
	
   	
   	
   	
  	
   	
   	
  powerApplied	
  *	
  dt)	
  
	
   	
   	
   	
   	
  );	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
  
26	
  /	
  42	
  
УСКОРЕНИЕ	
  	
  
И	
  ПРЫЖКИ	
  
Сила	
  	
  
сопротивления	
  (D)	
  
Гравитация	
  (W)	
  
УСКОРЕНИЕ	
  
28	
  /	
  42	
  
УСКОРЕНИЕ	
  
29	
  /	
  42	
  
30	
  /	
  42	
  
obj.force	
  =	
  new	
  Vector(0,	
  obj.mass	
  *	
  g	
  —	
  k	
  *	
  obj.vy);	
  
obj.acc	
  =	
  force.divide(obj.mass);	
  
РАСЧЕТ	
  СИЛЫ	
  
ОБНОВЛЕНИЕ	
  УСКОРЕНИЯ	
  
31	
  /	
  42	
  
obj.velo	
  =	
  obj.velo.addScaled(obj.acc,	
  dt);	
  
obj.pos	
  =	
  obj.pos.addScaled(obj.velo,	
  dt);	
  
ОБНОВЛЕНИЕ	
  СКОРОСТИ	
  
ОБНОВЛЕНИЕ	
  ПОЗИЦИИ	
  
УДАР	
  О	
  ПОВЕРХНОСТЬ	
  
32	
  /	
  42	
  
33	
  /	
  42	
  
ЗАЛИПАНИЯ	
  
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;	
  
}	
  
	
  
ПРОВЕРКА	
  УДАРА	
  
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;	
  
}	
  
	
  
ПРОВЕРКА	
  УДАРА	
  
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;	
  
}	
  
	
  
ПРОВЕРКА	
  УДАРА	
  
ПРУЖИНЫ	
  	
  
И	
  КОЛЕБАНИЯ	
  
36	
  /	
  42	
  
37	
  /	
  42	
  
ПРОСТОЕ	
  ГАРМОНИЧЕСКОЕ	
  
КОЛЕБАНИЕ	
  
Закон	
  Роберта	
  Гука	
  
Закон	
  Гука	
   Второй	
  закон	
  Ньютона	
  
УСКОРЕНИЕ	
  
38	
  /	
  42	
  
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]);	
  
РАСЧЕТ	
  СИЛЫ	
  
40	
  /	
  42	
  
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);	
  
	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
РАСЧЕТ	
  СИЛЫ	
  КУРСОРА	
  
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);	
  
	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
РАСЧЕТ	
  СИЛЫ	
  КУРСОРА	
  
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);	
  
	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
РАСЧЕТ	
  СИЛЫ	
  КУРСОРА	
  
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);	
  
	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
РАСЧЕТ	
  СИЛЫ	
  КУРСОРА	
  
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	
  
РАСЧЕТ	
  СИЛЫ	
  КУРСОРА	
  
Иванова	
  Елена	
  	
  
@liveldi90	
  
	
  
physicsdemos.liveldi.ru	
  

More Related Content

What's hot

Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
average-knapsack.beam.pdf
average-knapsack.beam.pdfaverage-knapsack.beam.pdf
average-knapsack.beam.pdfStas Fomin
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ  ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ  ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...ITMO University
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Nikolay Grebenshikov
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур it-people
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Mail.ru Group
 

What's hot (20)

Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Метод отдельных тел
Метод отдельных телМетод отдельных тел
Метод отдельных тел
 
лекция10
лекция10лекция10
лекция10
 
average-knapsack.beam.pdf
average-knapsack.beam.pdfaverage-knapsack.beam.pdf
average-knapsack.beam.pdf
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ  ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ  ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...
ПРИМЕНЕНИЕ ДИСКРЕТНОГО КОСИНУСНОГО ПРЕОБРАЗОВАНИЯ ДЛЯ ПОСТРОЕНИЯ ГОЛОГРАММЫ ...
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 
Generics
GenericsGenerics
Generics
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
 
Основы NumPy
Основы NumPyОсновы NumPy
Основы NumPy
 

Viewers also liked (14)

Information About Batra Henlay Cables
Information About Batra Henlay CablesInformation About Batra Henlay Cables
Information About Batra Henlay Cables
 
Moroxydine hcl 3160-91-6-api
Moroxydine hcl 3160-91-6-apiMoroxydine hcl 3160-91-6-api
Moroxydine hcl 3160-91-6-api
 
Cv
CvCv
Cv
 
Bordelon resume
Bordelon resumeBordelon resume
Bordelon resume
 
Lorenza april limited version
Lorenza april limited versionLorenza april limited version
Lorenza april limited version
 
Mupirocin 12650-69-0-api
Mupirocin 12650-69-0-apiMupirocin 12650-69-0-api
Mupirocin 12650-69-0-api
 
1509旅行
1509旅行1509旅行
1509旅行
 
5s-130627042041-phpapp02
5s-130627042041-phpapp025s-130627042041-phpapp02
5s-130627042041-phpapp02
 
Green Milan Nat Geo Apr 2015
Green Milan Nat Geo Apr 2015Green Milan Nat Geo Apr 2015
Green Milan Nat Geo Apr 2015
 
Books by grade level
Books by grade levelBooks by grade level
Books by grade level
 
p112-August 2013-1
p112-August 2013-1p112-August 2013-1
p112-August 2013-1
 
c_Toscana
c_Toscanac_Toscana
c_Toscana
 
Theory related to OT practice 2015
Theory related to OT practice 2015Theory related to OT practice 2015
Theory related to OT practice 2015
 
End of life care
End of life care End of life care
End of life care
 

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

  • 1. Анимируем  объекты     с  использованием  физики     в  JavaScript   Иванова  Елена     @liveldi90   Фронтенд  разработчик   Astroshock   25  июня  2015  
  • 2. СОДЕРЖАНИЕ   Конструкторы   Движение   Сила  трения   Ускорение  и  прыжки   Пружины  и  колебания   Анимация  
  • 6. setTimeout(func,  1000/fps);   setInterval(func,  1000/fps);   requestAnimaponFrame(func);   6  /  42  
  • 7. 6  /  42   setTimeout(func,  1000/fps);   setInterval(func,  1000/fps);   requestAnimaponFrame(func);  
  • 8. var  t0  =  0,  dt;   var  kSmothing  =  0.001;     funcpon  onTimer()  {              var  t1  =  new  Date().getTime();              dt  =  t1  —  t0;              t0  =  t1;        //  Меняем  кадры   }   7  /  42  
  • 10. ОБЪЕКТ  —  параметры   var  Obj  =  funcpon  (ops)  {                  this.$el            //  Доступ  к  элементу                  this.mass    //  Масса                    this.x                  //  Позиция  x,  y                  this.y                    this.vx              //  Cкорость  по  x,  y                  this.vy        …  };   9  /  42  
  • 11. ОБЪЕКТ  —  методы     Obj.prototype.pos     Obj.prototype.velo   10  /  42  
  • 12. ВЕКТОР  —  параметры   var  Vector  =  funcpon  (x,  y)  {                this.x  =  x;                this.y  =  y;   };   11  /  42  
  • 13. ВЕКТОР  —  методы   Vector.prototype.length()   Vector.prototype.add(vec)   Vector.prototype.subtract(vec)   Vector.prototype.mulpply(k)   Vector.prototype.divide(k)       12  /  42  
  • 14. ВЕКТОР  —  методы   Vector.prototype.addScaled  =      funcpon  (vec,  k)  {                    return  new  Vector(            this.x  +  k  *  vec.x,                this.y  +  k  *  vec.y);    };   13  /  42  
  • 18. obj.pos  =  new  Vector(10,  0);   obj.velo  =  new  Vector(60,  0);   17  /  42  
  • 19. obj.pos  =  new  Vector(10,  0);   obj.velo  =  new  Vector(60,  0);     funcpon  move()  {    obj.pos  =  obj.pos.addScaled(obj.velo,  dt);   }   17  /  42  
  • 24. 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  
  • 25. var  powerLoss  =  new  Vector(          powerLossFactor  *  obj.vx  *  obj.vx  *  dt,                                            powerLossFactor  *  obj.vy  *  obj.vy  *  dt);     ke  =  ke.subtract(powerLoss);   ОБНОВЛЕНИЕ  КИНЕТИЧЕСКОЙ   ЭНЕРГИИ   23  /  42  
  • 26. 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);  
  • 28. ДОБАВЛЕНИЕ  МОЩНОСТИ   if  (applyThrust)  {            ke  =  ke.add(new  Vector(                powerApplied  *  dt,                  powerApplied  *  dt)            );                   }   26  /  42  
  • 29. УСКОРЕНИЕ     И  ПРЫЖКИ  
  • 30. Сила     сопротивления  (D)   Гравитация  (W)   УСКОРЕНИЕ   28  /  42  
  • 32. 30  /  42   obj.force  =  new  Vector(0,  obj.mass  *  g  —  k  *  obj.vy);   obj.acc  =  force.divide(obj.mass);   РАСЧЕТ  СИЛЫ   ОБНОВЛЕНИЕ  УСКОРЕНИЯ  
  • 33. 31  /  42   obj.velo  =  obj.velo.addScaled(obj.acc,  dt);   obj.pos  =  obj.pos.addScaled(obj.velo,  dt);   ОБНОВЛЕНИЕ  СКОРОСТИ   ОБНОВЛЕНИЕ  ПОЗИЦИИ  
  • 35. 33  /  42   ЗАЛИПАНИЯ  
  • 36. 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;   }     ПРОВЕРКА  УДАРА  
  • 37. 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;   }     ПРОВЕРКА  УДАРА  
  • 38. 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;   }     ПРОВЕРКА  УДАРА  
  • 39. ПРУЖИНЫ     И  КОЛЕБАНИЯ  
  • 41. 37  /  42   ПРОСТОЕ  ГАРМОНИЧЕСКОЕ   КОЛЕБАНИЕ   Закон  Роберта  Гука  
  • 42. Закон  Гука   Второй  закон  Ньютона   УСКОРЕНИЕ   38  /  42  
  • 43. 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]);   РАСЧЕТ  СИЛЫ  
  • 45. 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);                }   }   РАСЧЕТ  СИЛЫ  КУРСОРА  
  • 46. 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);                }   }   РАСЧЕТ  СИЛЫ  КУРСОРА  
  • 47. 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);                }   }   РАСЧЕТ  СИЛЫ  КУРСОРА  
  • 48. 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);                }   }   РАСЧЕТ  СИЛЫ  КУРСОРА  
  • 49. 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   РАСЧЕТ  СИЛЫ  КУРСОРА  
  • 50. Иванова  Елена     @liveldi90     physicsdemos.liveldi.ru