2014-09-19 4 views
1

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

} 

Как рассчитать величину силы для применения каждого кадра, чтобы сделать ее вихрем?

Edit:

так я теперь объект идти прямо к центру вихря, но не «раскрутить»

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; 
} 

ответ

0

Вы хотите реализовать тангенциальную силу с магнитудой, что увеличивается к центру вихря.

Вот несколько псевдокодов.

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); 

} 

Вот изображение, которое показывает компоненты вектора:

Radial and tangential components.

Чтобы создать эффект водоворота должно быть увеличение радиальной (Fr) и тангенциальные (Ft) силы, как объект перемещается ближе к центр.

0

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

ball.getBody().setLinearVelocity(0, 0); 

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

force = mass1 * mass2 * [some constant]/(distance^2) 

Если у вас есть вектор из вашего тела в направлении черной дыры (вычисленной в black hole position - body position), то длина вектора - это расстояние, а после нормализации и умножения на силу у вас есть желаемый вектор силы и forceY, который необходимо наносить на тело при каждом обновлении до тех пор, пока он остается в зоне отверстия.

Однако эта формула заставит силу расти до бесконечности, когда тело приближается к отверстию, поэтому вы можете попробовать перейти на линейное преобразование (ближайшее = 1, самое большое = 0), если это вызывает какие-либо проблемы.

force = mass1 * mass2 * [some constant] * ((maxDistance - distance)/maxDistance) 
+0

Также вы можете использовать удобный метод 'Body # applyForceToCenter()'. – kajacx

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