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.
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:
alebo
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