2016-11-14 7 views
0

Скажите, что у меня есть объект рядом со мной за моим столом прямо сейчас и объект java в программе, над которой я работаю. Если бы я должен был сбросить реальный объект, он ускорялся бы вниз со скоростью 9,81 м/с (без учета сопротивления ветра), таким образом, скорость была бы 9,81 м/с/с, а общее положение было бы (-) 9,81 м/с/s/s относительно того, с чего он начался.Simulating Gravity

Теперь, если я написал программу Java с моим объектом Java моделирования этого я хотел бы сделать это как такой

public class HypotheticalObjectClass(){ 

    double position = 0, velocity = 0; 

    tick(){ 
     velocity += 9.81; 
     position += velocity; 
    } 

} 

Эта программа является точной до тех пор, как я его вызова клеща() один раз в секунду, но если это называется несколько раз в секунду, когда позиция взлетает из-за исчисления или что-то еще ... Я намерен использовать эту программу несколько раз в секунду, поэтому как бы исправить расчет, учитывая только мгновенные значения (такие как скорость, положение, вращение и т. д. ...) и, если это невозможно, какую систему мне нужно добавить, чтобы это стало возможным?

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

ответ

0

Вам необходимо знать разницу во времени между вашими звонками tick, тогда вы можете масштабировать ускорение и скорость в соответствии с ним.

public class HypotheticalObjectClass(){ 

    double position = 0, velocity = 0; 

    public void tick(double dt) { 
     velocity += 9.81 * dt; 
     position += velocity * dt; 
    } 

} 

Если accelaration в units/s^2 и скорости units/s тогда dt разница во времени в секундах между вызовами функций. Поэтому, если вы вызываете его один раз в секунду, вы должны называть его obj.tick(1.0). Однако наилучшей идеей является измерение времени между вызовами, потому что, как вы упомянули, разница во времени не всегда одинакова.

Обратите внимание, что этот метод является довольно неточным, однако он часто достаточно хорош. Для получения дополнительной информации о физическом моделировании см .: http://gafferongames.com/game-physics/integration-basics/

+0

У меня есть система для синхронизации вызовов в другом месте программы, но актуальная проблема гораздо более запутанна и ее трудно увидеть. Если бы у меня было это галочкой 30 раз в секунду, то в первый раз он добавит 1/30-й из 9,81 м/с к скорости, а затем добавит скорость в положение, что отлично. Но во второй раз, когда он называется, он добавляет 1/30-й из 9.81 к скорости, затем 2/30 в позицию, которая тогда уже составляет 3/30 секунды 9,81, на 8-м тике он уже достиг правильной позиции и будет продолжать резко превышать. Он теряет свою точность из-за того, насколько быстро положение накапливается. – jotnova

+1

Числовая интеграция никогда не бывает на 100% точнее. Прочтите данную статью, если вам нужно что-то лучше. – Rames

+0

О, извините, я полностью пропустил последнюю часть. – jotnova

 Смежные вопросы

  • Нет связанных вопросов^_^