Як я імітую маятник, що розгойдується?


9

Я хочу імітувати мотузку з прикріпленою вагою, коливаючись туди-сюди, як маятник. Будь-яка реальна фізика є надмірною; це просто нескінченно повторювати той же рух.

JQuery має "гойдалку" легкість, схожу на те, що я шукаю. Як це працює?

Я думав обертатися з одного кута в інший за допомогою Math.easeOutExpo, але справжні маятники полегшуються інакше ...


2
Поставити криву синуса в кутову швидкість маятника таким чином, що нульова точка знаходиться на вершинах, а найвище значення швидкості - внизу.
Стрілецький ніндзя

Відповіді:


10

Ну, вам доведеться трохи використовувати фізику, але вам не потрібно імітувати будь-яку фізику. Існують формули для руху маятника, які ви можете легко використовувати для встановлення обертання маятника. Для невеликих гойдалок рух можна наблизити простим гармонічним рухом .

Кутове зміщення в конкретний час можна наблизити до:

введіть тут опис зображення

Це найточніше для малого максимуму θ, але, ймовірно, буде досить точним для ваших цілей. Створіть функцію, яка займає поточний час, і виводить кут, на який слід обертати маятник, і обертайте спрайт на цю суму.


4

Ось нетригісний розрахунок, отриманий на основі прямого передвиборчого трюку та фізики 11 класу. Він передбачає, що початок є найнижчою точкою підвіски маятника, що L - довжина маятника, і що нормальна графічна умова y збільшується вниз, а x збільшується праворуч:

Оновлення: я спочатку зіпсував yAcceleration; це простіше.
Оновлення №2 : Додано явний контроль часу та додано одиниці вимірювання.

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
Часу в рівнянні бракує.
Майк Семдер

@MaikSemder: Одиниця часу визначається як цикл анімації, що б це не було. Чому можна було б зробити це інакше?
Пітер Геркенс

Зараз ваша інтеграція прискорень використовує непрямий час у 1 одиницю. Якщо ваша одиниця часу гри становить секунди, у вас може бути лише 1 кадр імітації в секунду, просто додайте час чітко, і ви позбудетеся цієї проблеми. Час вже є, просто зробіть це явним. Наприклад, час кадру змінюється, але вам потрібна стабільна константна швидкість анімації, незалежна від часу кадру, також між різними платформами, або ви хочете ефект сломома, безліч причин.
Майк Семдер

1
Це був мій погляд, g походить ззовні або "гра". Тепер у вас є одиниця часу. Дельта t зараз - це 1 одиниця часу. Для моделювання в режимі реального часу це не дуже зручно, оскільки у вашій грі є своя "ідея" минулого часу. Зробити це явним параметром, а не неявною константою, може зробити вашу відповідь корисною для гри.
Майк Семдер

2
Хороша :) швидкість повинна бути помножена і на "deltaT", щоб вивести "переміщення" зі швидкості, щоб її можна було додати до "х", схваленого
Maik Semder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.