If you're seeing this message, it means we're having trouble loading external resources on our website.

Ако използваш уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Ъглова скорост

Спомняш ли си всички тези неща?
местоположение = местоположение + скорост
скорост = скорост + ускорение
Нали това са нещата, на които посветихме почти всичко от последните два раздела? Е, можем да прилагаме точно същата логика и за въртящи се обекти.
ъгъл = ъгъл + ъглова скорост
ъглова скорост = ъглова скорост + ъглово ускорение
Всъщност горното е по-просто от това, с което започнахме, защото ъгълът е скаларна величина – число, а не вектор!
Като използваме отговора от предишното предизвикателство, да кажем, че искаме да завъртим жезъл с ProcessingJS на някакъв ъгъл. Кодът ни може да изглежда ето така:
translate(width/2, height/2);
rotate(angle);
line(-50, 0, 50, 0);
ellipse(50, 0, 8, 8);
ellipse(-50, 0, 8, 8);
След като добавим законите на движение, получаваме програмата по-долу. В началото жезълът не се върти, а след това се завърта все по-бързо с ускоряването на ъгъла на завъртане:
Можем да приложим тази идея в нашия обект Mover. Например можем да добавим свойствата, свързани с ъглово движение, към конструктора на Mover.
var Mover = function(m, x, y) {
    this.position = new PVector(x, y);
    this.mass = m;

    this.angle = 0;
    this.aVelocity = 0;
    this.aAcceleration = 0;

    this.velocity = new PVector(random(-1, 1), random(-1, 1));
    this.acceleration = new PVector(0, 0);
};
След това в update() обновяваме позицията и ъгъла според същия алгоритъм!
Mover.prototype.update = function () {

    this.velocity.add(this.acceleration);
    this.position.add(this.velocity);

    this.aVelocity += this.aAcceleration;
    this.angle += this.aVelocity;

    this.acceleration.mult(0);
};
Разбира се, за да има значение това, ще трябва също да завъртим обекта, когато го показваме.
Mover.prototype.display = function () {
    stroke(0, 0, 0);
    fill(175, 175, 175, 200);
    rectMode(CENTER);

    // pushMatrix и popMatrix са необходими, за да може завъртането
    // да не засегне останалия свят
    pushMatrix();
    // Задаваме за начало позицията на фигурата
    translate(this.location.x, this.location.y);
    // Завъртаме с ъгъла
    rotate(this.angle);
    rect(0, 0, this.mass*16, this.mass*16);
    popMatrix();
};
Ако изпълним горния код, няма да видим нищо ново. Това е така, защото ъгловото ускорение (this.aAcceleration = 0;) е инициализирано с 0. За да завъртим обекта, трябва да му дадем някакво ускорение! Със сигурност можем да напишем някакво различно число:
this.aAcceleration = 0{,}01;
Ето как ще изглежда програмата с горната логика със сила, изчислена спрямо централния привличащ обект Attractor:
Това е добро начало, но можем да получим и по-интересен резултат, като зададем динамично ъглово ускорение според силите в средата – тъй като обектите обикновено не се завъртат сами! Сега можем да продължим по този път и да се опитаме да моделираме физиката на ъгловото ускорение, като използваме концепциите на въртящия момент и момент на инерцията. Това ниво на симулация е извън обхвата на този курс – но все пак нещата ще станат малко по-сложни.
За сега едно бързо и не съвсем чисто решение ще ни свърши работа. Можем да получим разумни резултати, просто като изчислим ъгловото ускорение като функция на вектора на ускорение на обекта. Ето един такъв пример:
this.aAcceleration = this.acceleration.x;
Да, това е съвсем произволно. Но прави нещо. Ако обектът се ускорява надясно, неговата ъглова ротация се ускорява по посока на часовниковата стрелка; ускорение наляво води до ротация в посока, обратна на часовниковата стрелка. Разбира се, важно е да помислим за мащаба в този случай. Компонентата х на вектора на ускорение може да има стойност, която е прекалено голяма, и да предизвика въртене на обекта, което изглежда глупаво или нереалистично. Така разделянето на компонентата х на някаква стойност, или ограничаването на ъгловата скорост в разумни граници, може да помогне много. Ето и целия метод update() с добавените ограничения.
Mover.prototype.update = function () {
    this.velocity.add(this.acceleration);
    this.position.add(this.velocity);

    // Изчисли ъгловата скорост спрямо хоризонталното ускорение,
    // и го раздели, за да не е толкова силно
    this.aAcceleration = this.acceleration.x / 10{,}0;
    this.aVelocity += this.aAcceleration;

    // Изполвай ограничение, за да е сигурно, че завъртането не е извън контрол
    this.aVelocity = constrain(this.aVelocity, -0{,}1, 0{,}1);
    this.angle += this.aVelocity;

    this.acceleration.mult(0);
};
Ето как изглежда програмата с тези промени:
Курсът "Компютърни симулации на физични явления" е производeн на "Природата на кода" от Даниел Шифман, използвана от Creative Commons Attribution-NonCommercial 3,0 Unported License.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.