2016-01-04 2 views
1

Я делаю приложение paperjs, в котором у вас есть круги, и каждый круг может свободно перемещаться. Некоторые круги связаны друг с другом с помощью линий, которые заставляют круги приближаться друг к другу, т. Е. Линия имитирует резинку между кругами. Однако кругам не разрешается перекрываться, поэтому я хочу сделать какое-то противодействие. В настоящее время я реализовал это как отталкивающую силу между кругами. Для каждого круга я проверяю местоположение всех других кругов, и вектор скорости каждого круга увеличивается в противоположном направлении к кругу, близкому к нему, пропорционально тому, насколько он близок к этому. Таким образом, что-то вроде velocityvector += -(vectorFromThereToHere/10)Как реализовать отталкивание между 2D-кругами (paperjs)

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

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

+0

Не могли бы вы обеспечить простой образец в виде фрагмента кода или в JSFiddle? –

ответ

1

Вы можете реализовать inelastic collision, а затем шаг фиксации положения. Идея состоит в том, чтобы применить импульс к объектам в направлении нормали удара.

// vx: velocity vector of object x 
// ux: velocity vector of object x after impact 
// mx: mass of the object x (1 if all objects are the same size) 
// n: normal of impact (i.e.: p1-p2 in the case of circles) 
// I: the coefficient of the impulse 

// Equation of an inelastic collision 
u1 * n = u2 * n 
// Equations of the velocities after the impact 
u1 = v1 + I * n/m1 
u2 = v2 - I * n/m2 

// solved for I: 
I = (v1 - v2) * n/((n*n)*(1/m1 + 1/m2)) 

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

PS: Вы можете повторить весь этап столкновений в один период времени, а также, чтобы получить лучшие результаты, когда объекты участвуют во многих столкновениях (потому что они слиплись в большом шаре)

+0

Эта ссылка на неупругое столкновение отличная, помогает много – Irhala

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