03 - Sila

V predchádzajúcej kapitole sme si vysvetlili, čo to znamená vektor - ako základný prvok pre simuláciu pohybu a základnej fyziky. Vysvetlili sme si, že pohyb sa dá predstaviť, ako vektor rýchlosti aplikovaný na pozíciu. Zároveň, ze rýchlosť sa dá vyrátať ako zrýchlenie aplikované na rýchlosť. Výsledné animácie tak-trocha pripomínali správanie sa objektov v beztiažovom stave.

Teraz si to všetko ideme opäť trocha skomplikovať. Oprášime fyziku z čias strednej školy a skúsime si o čosi presvedčivejšie nasimulovať pohyb v našom kóde.

Čo je to sila?

Pod silou si opäť môžeme predstaviť všetko možné. Sila zvyku, pomocná sila do kuchyne, silná káva a silné reči.

Tentokrát asi nebude asi prekvapenie, naša predstava je tentokrát:

Sila je vektorová fyzikálna veličina, ktorá vyjadruje mieru vzájomného pôsobenia telies alebo polí. Obyčajne sa označuje písmenom F z angl. force. https://sk.wikipedia.org/wiki/Sila

Newtonove pohybové zákony

1. zákon zotrvačnosti

Objekt v pokoji zostáva v pokoji a objekt v pohybe zostáva v pohybe.

3. zákon akcie a reakcie

Sily sa vždy vyskytujú v pároch. Dve sily majú rovnakú silu, ale opačný smer.

(tento zákon síce platí ale v našom svete ho budeme pre jednoduchosť často opomínať, pretože je väčšinou marginálny)

2. zákon sily

Sila sa rovná súčinu hmotnosti a zrýchlenia.

Práve tento zákon je pre nás ten najdôležitejší

Kde F je pôsobiaca sila, a je vyvolané zrýchlenie a m je hmotnosť hmotného bodu.

Nás zaujíma práve výpočet zrýchlenia a = F / m.

Ako určíme hmostnosť? Pre začiatok si povedzme, že hmotnosť = 1 a odrazu je výpočet len:

let a = F; // resp. F/1

Teraz si otvorme našu triedu Mover. Budeme chcieť pridať metódu:

applyForce(force) {
    //...
}

// a jej pouzitie

mover.applyForce(wind);
mover.applyForce(gravity);
//... a ine

Spájanie síl

zrýchlenie sa rovná súčtu všetkých síl vydelených hmotnosťou

void applyForce(force) {
    acceleration.add(force);
}

Teraz dôležitá poznámka. Netreba zabúdať na 1. newton zákon. Objekt v pohybe zostáva v nezmenenom pohybe. My ale v každom kroky plánujeme akumulovať zrýchlenie! Je dobré uvedomiť si, že zrýchlenie narozdiel od pozície nieje vôbec závislé od predchádzajúcej hodnoty. Ak nepôsobí žiadna nová sila, proste nieje a objekt sa pohybuje konštantnou rýchlosťou. Preto do metódy update() na konci zresetujeme zrýchlenie. (ako?)

 void update() {
    velocity.add(acceleration);
    location.add(velocity);
    acceleration.mult(0);
 }

Práca s hmotnosťou

Ono popravde, v skutočnosti objekty nejakú hmotnosť vždy majú.

Poďme si od našej triedy Mover pridať ďaľšiu hodnotu:

class Mover {
  constructor(){
    this.position = createVector();
    this.velocity = createVector();
    this.acceleration = createVector();
    this.mass = ????;
  }
}

A výsledné zrýchlenie treba ešte predeliť hmotnosťou:

applyForce(force) {
  let f = force.copy(); //Making a copy of the vector before using it!
  f.div(this.mass); //Divide the copy by mass!s
  this.acceleration.add(f);
}

Alebo:

 applyForce(force) {
    const f = p5.Vector.div(force, this.mass);
    this.acceleration.add(f);
 }

Úloha 1:

Úloha 2:

Zober nasledujúci sketch:

jeden mover

alebo

pole mo vers

Zadefinuj applyForce(), pridaj gravitáciu a vietor z prava po klknutí myšou.

Úloha 3:

Uprav triedu mover tak, aby vedela príjmať pozíciu a hmotnosť pri vytváraní objektu

class Mover {
  constructor(x, y, m) {
    // ....
  }
}

Aplikuj mass na veľkosť objektu. Vytvor dva alebo viac objektov s rôznou velkosťou. Prečo sa gravitácia správa zvláštne?

Gravitácia na Zemi a modelovanie sily

Podľa experimentu od Galilea (1589) vieme, že dva objekty s rozličnou hmotnosťou dopadnú z výšky naraz. Pritom vieme, že newtonov 2. zákon platí. Ako je tomožné? Pretože gravitácia je aplikovaná v súmernosti s váhou objektu.

let gravityA = p5.Vector.mult(gravity, moverA.mass)

Trenie (friction)

je sila, ktorá pôsobí opačne k pohybu.

Podľa vzorca, smer je pohyb * -1 a magnitúda je μ∗N, kde μ je koeficient trenia.

let c = 0.1;
let friction = mover.velocity.copy();
friction.mult(-1);
friction.setMag(c);

Úloha 4

Aplikuj trenie pri každom dopade lopty o zem.

Úloha 5

Uprav sketch, aby si vedel každým klikom pridávať objekt na scénu rôznej velkosti (= vytvor pole let movers = []). Zmeň pridávanie vetra na kliknutie pravým tlačidlom myši (mouseButton === RIGHT). Pozoruj: aký je rozdiel medzi aplikovaním sily "vetra" a "gravitáciou" v závislosti od velkosti/hmotnosti? Bonus 1: nastav velkosť moveru ťahaním myši (starterpack: https://editor.p5js.org/igor-kamil/sketches/aiMqtcUrN) Bonus 2: pridaj zvuk pre dotyk s hranou sound.play();.

Môžeš vychádzať z nasledujúceho. sketchu:

Motivačný track k téme:

Last updated