Как я применяю силу тяжести к своему приложению прыгающего мяча?

Вы должны использовать формат yyyy-MM-dd HH:mm:ss для входа 2019-01-17 11:01:15, yyyy/MM/dd HH:mm:ss работает, когда вход подобен 2019/01/17 11:01:15.

Обновление

Вам необходимо преобразовать два формата:

DateTimeFormatter inputFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); 
DateTimeFormatter outputFormat = DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss"); 
DateTime fromDate = DateTime.parse("2019-01-17 11:01:15", inputFormat);
System.out.println(outputFormat.print(fromDate));
11
задан T.Rob 28 November 2011 в 03:52
поделиться

8 ответов

То, что необходимо сделать, постоянно вычитают маленькую константу (что-то, что представляет 9,8 м/с) от yVector. То, когда шар понижается (yVector уже отрицательно), это заставило бы его пойти быстрее. То, когда это повышается (yVector положительно), это замедлило бы его.

Это не составляло бы трение, таким образом, вещи должны возвратиться в значительной степени навсегда.

edit1: Для составления трения, каждый раз, когда это инвертирует (и Вы инвертируете знак), понизьте абсолютное число немного. Как то, если это нападает на yVector =-500 при инвертировании знака сделайте его +480 вместо +500. Необходимо, вероятно, сделать то же самое к xVector, чтобы мешать ему возвратиться от одной стороны к другой.

edit2: Кроме того, если Вы хотите, чтобы это реагировало на "трение о воздух", уменьшите оба вектора очень небольшим количеством каждая корректировка.

edit3: О вещи, вращающейся в нижней части навсегда - В зависимости от того, как высоко Ваши числа, это могла быть одна из двух вещей. Или Ваши количества являются большими, и это просто, кажется, берет навсегда для окончания, или Вы округляетесь, и Ваши Векторы всегда равняются 5 или чему-то. (90% из 5 4.5, таким образом, это может окружить к 5).

Я распечатал бы оператор отладки и видел бы то, на что похожи Векторные числа. Если они переходят в куда-нибудь приблизительно 5 и просто остаются там, то можно использовать функцию, которая усекает часть к 4 вместо того, чтобы округлиться назад к 5. Если это продолжает понижаться и в конечном счете останавливается, то Вам, возможно, придется повысить Ваш коэффициент трения.

Если Вы не можете найти легкую функцию "округления", Вы могли бы использовать (0.9 * Вектор) - 1, вычитание 1 от Вашего существующего уравнения должно сделать то же самое.

15
ответ дан 3 December 2019 в 02:41
поделиться

Каждый интервал времени необходимо применить эффекты силы тяжести путем ускорения шара в y вниз направление. Как предложенный счет K, это так же просто как создание вычитания от Вашего "yVector". Когда шар достигает низшей точки, yVector =-yVector, поэтому теперь он перемещается вверх, но все еще ускоряется вниз. Если Вы хотите заставить шары в конечном счете прекратить возвращаться, необходимо сделать коллизии немного неэластичными, в основном путем удаления некоторой скорости в да направление, возможно вместо "yVector =-yVector", делает это "yVector =-0.9 * yVector".

1
ответ дан 3 December 2019 в 02:41
поделиться
public void step()
{
    posX += xVector;
    posY += yVector;

    yVector += g //some constant representing 9.8

    checkCollisions();
}

в checkCollisions (), необходимо инвертировать и умножить yVector на число между 0 и 1, когда это возвращается на земле. Это должно дать Вам желаемый эффект

1
ответ дан 3 December 2019 в 02:41
поделиться

Когда шары все вращаются на земле, да, проверьте, чтобы видеть, ли скорость ниже определенного минимального значения и, если так, обнулила его. Если Вы будете смотреть на физику позади этого типа идеализированного движения и соответствовать тому, что происходит в реальном мире, то Вы будете видеть, что единственное уравнение не может использоваться для составления того, что реальный шар прекращает перемещаться.

BTW, что Вы делаете, называют Euler методом для численного интегрирования. Это идет как это:

  • Запустите с кинематических уравнений движения:
    x (t) = x0 + vx*t + 0.5*axt^2
    y (t) = y0 + vyt
    + 0.5*ayt^2
    vx (t) = vx0 + axt

    vy (t) = vy0 + ay*t
    Где X и Y являются положением, vx, и vy являются скоростью, топором и да являются ускорением, и t время. x0, y0, vx0, и vy0 являются начальными значениями. Это описывает движение объекта в отсутствие любой внешней силы.

  • Теперь примените силу тяжести:
    да =-9.8 m/s^2
    К этой точке нет никакой потребности сделать что-либо хитрое. Мы можем решить для положения каждого шара с помощью этого уравнения в течение любого времени.

  • Теперь добавьте трение о воздух: Так как это - сферический шар, мы можем предположить, что это имеет коэффициент трения c. Обычно существует два варианта для того, как смоделировать трение о воздух. Это может быть пропорционально скорости или квадрату скорости. Давайте использовать квадрат:
    топор =-cvx^2
    да =-cvy^2
    - 9.8
    Поскольку ускорение теперь зависит от скорости, которая не является постоянной, мы должны интегрироваться. Это плохо, потому что нет никакого способа решить это вручную. Мы должны будем интегрироваться численно.

  • Мы делаем шаги дискретного времени, dt. Для метода Euler's мы просто заменяем все происшествия t в вышеупомянутых уравнениях с dt и используем значение с предыдущего такта вместо начальных значений, x0, y0, и т.д. Таким образом, теперь наши уравнения похожи на это (в псевдокоде):

    //Сохраните предыдущие значения
    xold = x;
    yold = y;
    vxold = vx;
    vyold = vy;

    //Ускорение обновления
    топор =-cvxold^2;
    да =-cvyold^2
    - 9.8;

    //Скорость обновления
    vx = vxold + axdt;
    vy = vyold + aydt
    ;

    //Положение обновления
    x = xold + vxold*dt + 0.5*axdt^2;
    y = yold + vyolddt
    + 0.5*ay*dt^2;

Это - приближение, таким образом, это не будет точно корректно, но это посмотрит хорошо. Проблема состоит в том, что в течение больших тактов, ошибочных увеличений, поэтому если бы мы хотим точно смоделировать, как реальный шар переместился бы, мы должны будем использовать очень крошечные значения для dt, который вызвал бы проблемы с точностью на компьютере. Для решения этого существуют более сложные методы. Но если Вы просто хотите видеть поведение, которое похоже на силу тяжести и трение одновременно, затем метод Euler's в порядке.

13
ответ дан 3 December 2019 в 02:41
поделиться

Вы действительно хотите моделировать то, что сила тяжести делает - все, что она делает, создают силу, которая действует со временем для изменения скорости объекта. Каждый раз, когда Вы предпринимаете шаги, Вы изменяете скорость своего шара немного для "вытягивания" его к нижней части виджета.

Для контакта с без трений / прыгающий мяч улаживает проблему, необходимо заставить "наземную" коллизию проявить другой эффект, чем просто строгое отражение - это должно удалить некоторую сумму энергии от шара, заставив это прийти в норму в меньшей скорости после того, как это поражает землю, чем это было бы иначе.

Другая вещь, которую Вы обычно хотите сделать в этих типах бодрой визуализации, дают земле некоторое поперечное трение также, так, чтобы, когда это поражает землю все время, это в конечном счете прокрутилось к остановке.

0
ответ дан 3 December 2019 в 02:41
поделиться

Я соглашаюсь с тем, какой "счет K", сказанный, и, добавил бы, что, если Вы хотите, чтобы они "обосновались", необходимо будет уменьшать векторы X и Y со временем (примените сопротивление). Это должно будет быть очень небольшим количеством за один раз, таким образом, Вам, вероятно, придется изменить Ваши векторы от интервала до типа с плавающей точкой или только уменьшить их на 1 каждые несколько секунд.

0
ответ дан 3 December 2019 в 02:41
поделиться

То, что Вы хотите сделать, изменить значения xVector и yVector для моделирования силы тяжести и трения. Это действительно довольно просто сделать. (Должен заменить все Ваши переменные к плаваниям. Когда это прибывает время для рисования, только вокруг плаваний.)

В Вашей ступенчатой функции, после обновления положения шара, необходимо сделать что-то вроде этого:

yVector *= 0.95;
xVector *= 0.95;
yVector -= 2.0;

Это уменьшает масштаб скорости X и Y немного, позволяя Вашим шарам в конечном счете прекратить перемещаться, и затем применяет постоянное нисходящее "ускорение" к значению Y, которое накопится быстрее, чем "замедление" и заставит шары падать.

Это - приближение того, что Вы действительно хотите сделать. То, что Вы действительно хотите, должно сохранить вектор, представляющий ускорение Ваших шаров. Каждый шаг Вы затем отметили бы точкой продукт что вектор с постоянным вектором силы тяжести для небольшого изменения ускорения шара. Но я думаю, что мой более сложен, чем Вы хотите добраться, если Вы не ищете более реалистическое моделирование физики.

0
ответ дан 3 December 2019 в 02:41
поделиться

Что должно быть сделано, когда это поражает "землю" так, чтобы я мог позволить этому возвращаться снова

Если Вы принимаете идеальную коллизию (т.е. вся энергия сохраняется), все, что необходимо сделать реверс знак одного из скоростного скаляра, в зависимости от которого врезались в стену.

Например, если мяч попадает в правильный или левый стенной реверс x скалярный компонент и отпуск y скалярный компонент то же:

 this.xVector = -this.xVector;

Если мяч попадает в реверс главных или донных порогов водозабора y скалярный компонент, и оставьте x скалярный компонент тем же:

 this.yVector = -this.yVector;

но несколько короче затем в предыдущий раз?

В этом сценарии часть энергии будет потеряна в коллизии со стеной, поэтому просто добавляют в коэффициенте потерь для взятия части скорости каждый раз, когда в стену врезаются:

 double loss_factor = 0.99;
 this.xVector = -(loss_factor * this.xVector);
 this.yVector = -(loss_factor * this.yVector;
0
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: