У меня есть игра, в которой есть два весла, и у меня есть работа, настроенная так, чтобы либо игроки, либо ИИ могли управлять веслом. Тем не менее, я пытаюсь понять, как заставить мой ИИ фактически плавно работать после мяча и поймать его, а не просто грубо заставлять его с базовым "Направлением шара" = Противоположное направление AI движется.
Чтобы сделать это, я пытаюсь написать код, который позволит ИИ предсказать, куда он приземлится, когда мяч находится в этом суде или будет. Это не так хорошо. Это диаграмма того, чего я хочу достичь:
Итак, я изучал 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);
Тем не менее, я чувствую, что я упростил его или что-то забыл. Мои расчеты удалены, и луч не появляется там, где он должен, если это вообще происходит. Что я сделал неправильно?
очень важно применять гравитацию к шару на каждом шагу, чтобы сделать естественным что-то вроде этого:
мяч находится в вашем положении, готовом быть занесенным
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;
Вам, вероятно, придется подстроить цифры, но если я правильно все помню, он должен работать примерно так. Надеюсь, что это имеет смысл
Все, что вам нужно, это уравнения Кинематики.
Эти уравнения прекрасно описывают снаряд в движении. Поэтому вы можете использовать их, чтобы предсказать, где и с какими компонентами мяч приземлится.
Вот график, который поможет вам понять.
Это будет упрощено, если предположить, что сила тяжести снижается, а пол - при Y=0
. Его можно было бы расширить, используя векторную математику для произвольных линий и направлений гравитации, но для ваших целей вам должно быть хорошо, используя два вышеупомянутых предположения. Я также предполагаю, что BallPosition
является объектом Transform
, но математика была бы такой же, если бы она не была. Я также не допущу трения воздуха на мяче, что сделало бы математику более сложной.
По сути, вам нужно рассчитать время, пока мяч не ударит по земле, а затем экстраполирует X-позицию мяча в это время.
Классическая формула, определяющая движение ускоряющего объекта, равна d = vt + at^2/2
, где v
- скорость тока, a
- ускорение, t
- количество пройденного времени. Чтобы выяснить время удара, мы просто решаем для t
.
Чтобы выяснить, когда мяч ударит по земле, вам нужно установить d = BallPosition.position.y * -1
, a = Physics.gravity.y
и v = BallPosition.rigidbody.velocity.y
. Это даст нам количество секунд до удара.
Поскольку гравитация считается полностью нисходящей, и никакие другие силы не действуют на шар, мы можем знать, что X-положение шарика при ударе времени равно BallPosition.position.x + BallPosition.rigidbody.velocity.x * impactTime
. Это будет X-позиция, на которую должен двигаться ваш компьютер.
... Формула должна работать в любое время, когда гравитация полностью вниз, даже если мяч находится на верхней части траектории или отходит от вашего компьютерного плеера. Вероятно, вам захочется придумать какую-то стратегию для того, что должен делать компьютер, ожидая, когда человек ударит по мячу и установит новую траекторию шара, поскольку вы, вероятно, не хотите, чтобы компьютер пытался убежать в сторону человека сети. В зависимости от того, как ваши игроки могут ударить по мячу, вы можете предсказать новую скорость, которую мяч получит после того, как человек ударит ее, а затем подаст эти данные в эту формулу.