Как создать эффект водоворота / вихря?
Я пытаюсь сделать эффект вихря на круговое тело, которое является датчиком. Я искал это и все примеры, которые я ищу, на C++ или Objective C, и я, кажется, не очень хорошо их перевёл.
когда мои объекты сталкиваются, он вызывает beginContact(..) и устанавливает флаг, чтобы я мог вызвать bodyToUpdate.applyForce(...);
public void beginContact(Contact contact) {
setColliding(true);
}
//updating collition every frame
public void act(){
if (colliding) {
ball.getBody().applyForce(....);
}
Как рассчитать величину силы, чтобы применить каждый кадр, чтобы сделать его вихрем?
Редактировать:
так что теперь у меня есть объект, идущий прямо к центру вихря, но нет "вращения"
public void act() {
if (colliding) {
ball.getBody().setLinearVelocity(0, 0);
ball.getBody().applyForce((portal.getBody().getPosition().x - ball.getBody().getPosition().x) * i,
(portal.getBody().getPosition().y - ball.getBody().getPosition().y) * i,
ball.getBody().getPosition().x, ball.getBody().getPosition().y, true);
i++;
} else
i = 10;
}
2 ответа
Вы хотите реализовать тангенциальную силу с величиной, которая увеличивается к центру вихря.
Вот какой-то псевдокод.
radialVector = objectPosition - vortexPosition;
tangentialVector = radialVector.perpendicularVector();
if (radialVector.length() < vortexRadius) {
// Swirl faster when near the center of the vortex.
// Max tangential force when distance from center is 0.
// Min tangential force when distance from center is vortexRadius.
forceMagnitude = map(radialVector.length(), vortexRadius, 0, minTangentialForce, maxTangentialForce);
force = forceMagnitude * tangentialVector.normalize();
object.applyForce(force);
}
Вот изображение, которое показывает компоненты вектора:
Чтобы создать эффект водоворота, необходимо увеличивать радиальные (Fr) и тангенциальные (Ft) силы по мере приближения объекта к центру.
Если под "вращением" вы подразумеваете, что падающий объект будет двигаться по кривой или спирали, а не менять направление движения сразу по направлению к черной дыре, это легко исправить.
ball.getBody().setLinearVelocity(0, 0);
Это полностью останавливает текущее движение тела. Я бы начал с удаления этой строки. Кроме того, для лучшего реалистичного поведения вы можете следовать правильной формуле для вычисления силы притяжения, которая выглядит примерно так:
force = mass1 * mass2 * [some constant] / (distance ^ 2)
Когда у вас есть вектор от вашего тела к черной дыре (вычисляется как black hole position - body position
), длина вектора - это расстояние, и после нормализации и умножения на силу, вы получите желаемое forceX
а также forceY
вектор силы, который должен быть применен к телу при каждом обновлении, пока он остается в диапазоне отверстия.
Однако эта формула будет приводить к увеличению силы до бесконечности при перемещении тела ближе к отверстию, поэтому вы можете попробовать перейти к линейному преобразованию (closest = 1, farest = 0), если это вызывает какие-либо проблемы.
force = mass1 * mass2 * [some constant] * ( (maxDistance - distance) / maxDistance )