Научить ИИ ловить мяч?

1

У меня есть игра, в которой есть два весла, и у меня есть работа, настроенная так, чтобы либо игроки, либо ИИ могли управлять веслом. Тем не менее, я пытаюсь понять, как заставить мой ИИ фактически плавно работать после мяча и поймать его, а не просто грубо заставлять его с базовым "Направлением шара" = Противоположное направление AI движется.

Чтобы сделать это, я пытаюсь написать код, который позволит ИИ предсказать, куда он приземлится, когда мяч находится в этом суде или будет. Это не так хорошо. Это диаграмма того, чего я хочу достичь:

Изображение 174551

Итак, я изучал Unity3D и придумал это:

Vector3 BallMinder = BallPosition.gameObject.rigidbody.velocity;
float BallX = BallMinder.x;
float BallY = BallMinder.y * Time.deltaTime;
float GroundHitPointX = (BallY + BallX);

Vector3 BallImpactPoint = new Vector3 (GroundHitPointX, 0, 0);
Debug.Log (BallImpactPoint);
Debug.DrawRay (BallImpactPoint, Vector3.up, Color.green);

Тем не менее, я чувствую, что я упростил его или что-то забыл. Мои расчеты удалены, и луч не появляется там, где он должен, если это вообще происходит. Что я сделал неправильно?

  • 0
    Я думаю, что вы можете сделать это довольно просто. Вы берете X-позицию мяча и заставляете компьютерную ракетку перемещаться в эту позицию с его максимальной скоростью. Чтобы решить, что компьютер должен подождать в том месте, где будет касаться мяча, вам нужно будет рассчитать место выпадения (как вы это сделали), но на самом деле это неправильный расчет хе :)
  • 0
    Это то, чем я занимался раньше, и это никогда не казалось мне человечным - я хочу, чтобы ИИ действовал, как если бы он был другим игроком, и пытался поймать мяч вместо того, чтобы двигаться к нему и получать, возможно, 50% времени.
Теги:
unity3d
artificial-intelligence
physics

3 ответа

0
Лучший ответ

очень важно применять гравитацию к шару на каждом шагу, чтобы сделать естественным что-то вроде этого:

мяч находится в вашем положении, готовом быть занесенным

ball.x = 20;
ball.y = 10;
xVelocity = 0; 
yVelocity = 0;
gravity = 0.1;

ты забрасываешь мяч
Когда вы забрасываете шар, вы устанавливаете xVelocity на константу, давайте скажем 1 и yVelocity до 5. Итак:

xVelocity = 1;
yVelocity = 5;
ball.x+=xVelocity;
ball.y+=yVelocity; //to start the ball moving

Теперь в gameloop вы вычисляете положение мяча следующим образом:

tick
{
    if(ball.y > 10)  //if the ball is off the ground (i asume 10 is ground) 
    {
        ball.x+=xVelocity;
        ball.y+=yVelocity;
        yVelocity-=gravity;
    }
}

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

while(dummyBall.y > 10)
{
    dummyBall.x+=xVelocity;
    dummyBall.y+=yVelocity;
    yVelocity-=gravity;
}
landingPosX = dummyBall.x;

Вам, вероятно, придется подстроить цифры, но если я правильно все помню, он должен работать примерно так. Надеюсь, что это имеет смысл

  • 0
    Так что я был близко, но без сигары. Мяч уже движется сам с физикой и гравитацией, но я пытался выяснить, как применить гравитацию к расчету зоны приземления. Я попробую это, когда смогу.
  • 0
    Было немного сложно выбрать ответ с таким количеством хороших ответов. Я был на полпути и использовал это, чтобы исправить остальное. Или, по крайней мере, часть этого. Это заслуживает одобрения.
1

Все, что вам нужно, это уравнения Кинематики.

Изображение 174551

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

Вот график, который поможет вам понять.

Изображение 174551

  • 0
    Имейте в виду, что физический движок игры, вероятно, не такой надежный, как в реальном мире, и это на самом деле не может быть подходящим предиктором того, где объект на самом деле окажется.
  • 0
    @Servy Я подумал, что OP будет управлять своей собственной физикой, такой как добавление силы к мячу и контроль самого ускорения. Я склонен полагаться на свою физику, а не на то, что дает мне Unity3d; Я использую его только для рендеринга графики. Тем не менее, вы делаете отличное замечание, если OP сильно зависит от физики двигателя.
1

Это будет упрощено, если предположить, что сила тяжести снижается, а пол - при Y=0. Его можно было бы расширить, используя векторную математику для произвольных линий и направлений гравитации, но для ваших целей вам должно быть хорошо, используя два вышеупомянутых предположения. Я также предполагаю, что BallPosition является объектом Transform, но математика была бы такой же, если бы она не была. Я также не допущу трения воздуха на мяче, что сделало бы математику более сложной.

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

Классическая формула, определяющая движение ускоряющего объекта, равна d = vt + at^2/2, где v - скорость тока, a - ускорение, t - количество пройденного времени. Чтобы выяснить время удара, мы просто решаем для t.

Изображение 174551

Чтобы выяснить, когда мяч ударит по земле, вам нужно установить d = BallPosition.position.y * -1, a = Physics.gravity.y и v = BallPosition.rigidbody.velocity.y. Это даст нам количество секунд до удара.

Поскольку гравитация считается полностью нисходящей, и никакие другие силы не действуют на шар, мы можем знать, что X-положение шарика при ударе времени равно BallPosition.position.x + BallPosition.rigidbody.velocity.x * impactTime. Это будет X-позиция, на которую должен двигаться ваш компьютер.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню