Как создать эффект водоворота / вихря?

Я пытаюсь сделать эффект вихря на круговое тело, которое является датчиком. Я искал это и все примеры, которые я ищу, на 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 )
Другие вопросы по тегам