Простой пример кода для формулы для моделирования замедления вращающейся сферы из-за трения и силы тяжести? - PullRequest
2 голосов
/ 14 октября 2010

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

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

Я использую Delphi 6 Pro, но я также знаю C / C ++, Basic, Java и Javascript.

Ответы [ 4 ]

3 голосов
/ 14 октября 2010

Скорость - это изменение смещения.Ускорение - это изменение скорости.

Гравитация или трение просто вызывают ускорение (возможно, отрицательное).

Поэтому все, что вам нужно сделать, это применить отрицательное ускорение, когда они не активируют ускоритель.

Итак, давайте предположим, что у вас есть угол, который меняется.Применение ускорителя увеличивает величину изменения угла на каждой итерации или временном шаге.Если ваш угол равен t и ваше изменение угла называется dt (угловая скорость), то при применении ускорителя вы получите:

t = t + dt
dt = dt +

, где a зависит от того, сколько force вы применяете или насколько они «нажали» на ускоритель (то есть это ускорение).

ВыВозможно, вы захотите ограничить dt (то есть скорость вращения) - если вы хотите вращаться только в одном направлении, у вас будет верхний положительный предел и нижний предел 0. Если вы хотите оба направления, вы можете иметь более низкий отрицательный предели верхний положительный предел.

Все, что вам нужно сделать, это сделать a некоторое отрицательное число, когда ускоритель не применяется (если dt положительно - сделать a положительным, если dt отрицательно),и убедитесь, что вы не «оборачиваетесь» (т. е. делайте dt 0, когда оно приближается к 0).

2 голосов
/ 14 октября 2010

Это было некоторое время назад, но согласно моим учебникам по динамике, Момент инерции для сферы определяется как I = (2/5) m * r ^ 2. m - масса, r - радиус сферы (все в системе СИ). На этой странице вы найдете несколько примеров использования массового момента инерции для расчета замедления сферы в результате применения отрицательного крутящего момента. Этот токру является результатом трения. Поскольку вы не определяете материал поверхности сферы и окружающих поверхностей, вы не можете рассчитать трение, и вам придется самостоятельно выбирать хорошую силу.

2 голосов
/ 14 октября 2010

Пока вы не решаете звездные проблемы, я не вижу, какое влияние гравитация имеет на замедление вращения.

Трение практически пропорционально текущей скорости вращения (фактически скорости на поверхности сферы).

Таким образом, формула для текущей скорости вращения во времени w (t) может выглядеть примерно так:

w(t) = w0*exp(-c*(t - t0))

, где t0 - время начала трения, wt - скорость вращения в это время. Коэффициент с> 0 определяет, насколько быстро скорость будет уменьшаться - чем выше с, тем быстрее будет снижаться скорость. Эта формула действительна для всех t> = t0.

Обратите внимание, что для t = t0 функция exp возвращает 1, и вы получаете начальную скорость, а для t -> ∞ функция exp (и, следовательно, результирующая скорость) возвращает -> 0 (минус перед символом c гарантирует это).

1 голос
/ 16 октября 2010

Вы уже приняли ответ, но я добавлю свой кусок.

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

Когда объект скользит по твердой поверхности, скорость замедления постоянна. Сила находится в направлении, противоположном движению, и ее величина зависит от нескольких вещей, но не , а скорости. Когда объект полностью останавливается, сила исчезает. То же самое относится и к глобусу, поворачивающемуся вокруг твердой оси.

Когда объект проходит через жидкость, сила замедления увеличивается со скоростью, поэтому чем быстрее объект, тем больше сопротивление. Когда объект замедляется, замедление становится слабее, и объект продолжает замедляться, но никогда не останавливается. Это описывает глобус, вращающийся в воздухе или воде. На достаточно высоких скоростях сопротивление пропорционально v 2 , а на очень низких скоростях оно пропорционально v (я не знаю о переходе между этими доменами).

Поэтому я предлагаю t = -a w b , где w - угловая скорость. Параметр a представляет собой силу трения, а b описывает тип замедления; b = 0 - это как трение на твердой оси, b = 2 - как вращение в воздухе, а b = 1 - как вращение в сиропе. Другие значения b могут выглядеть или не выглядеть реалистичными или быть реалистичными.

...