x


Constant time way to find intersection of two objects when given speeds and directions of both?

I plan to make a missile track and opponent and collide wi the opponent. I need to know a good intersection point when given my missile and opponent speeds and direction.

This is mainly a physics problem. I know I have to try and set up a few equations based on the equation of distance = rate * time, then solve time and extrapoloate position from t.

I saw this post in another forum: intersection

I am still a bit confused. Can somebody explain this to me, rather than jumping to a result?

more ▼

asked Apr 01, 2013 at 03:34 PM

1337GameDev gravatar image

1337GameDev
780 167 134 147

(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

I like to split these problems out into two components. Figure out how long it will take your missile to reach your target, then use that time to predict where your target will be.

To figure out the first part, you'll want to figure out how far your target is from the missle currently and how fast your target is moving away from the missile. This means trimming the target's velocity so that all that remains is how fast he is moving along the line between where he is and where the missile is. You then use this relative velocity to determine how long it will take for the missile to catch up to the target. Once you have that time, you use it to predict where your target will be in that time, and then aim the missile for that destination.

// The vector that extends from the missile to the target
TargetOffset = TargetLocation - MissileLocation;

// The distance from the missile to the target
TargetDistance = TargetOffset.magnitude;

// Normalize the offset vector into a direction - same as doing TargetOffset.normalized
TargetDirection = TargetOffset / TargetDistance;

// How fast the target and missle are moving relative to one another (if the missile
// hasn't been fired yet, use TargetDirection * FiringSpeed for his velocity)
// Another way to think of this is how fast the missile would be moving relative to
// the target if the target wasn't moving at all
RelativeVelocity = MissileVelocity - TargetVelocity;

// How fast the target is moving away from the missile
RelativeSpeed = Vector3.Dot( RelativeVelocity, TargetDirection );

// If RelativeSpeed is negative, that means the target is traveling faster than the
// missile and the missile cannot catch up to it.
// For this case, you can just fake an estimated intercept time so the missile at
// least makes a decent attempt
if ( RelativeSpeed <= 0.0 )
{
    InterceptTime = 1.0;
}
else
{
    InterceptTime = TargetDistance / RelativeSpeed;
}

// We now have an estimate of how long it will take our missile to catch up to the
// target - plug it in to his physics equation to predict where the target will be.
InterceptLocation = TargetLocation + TargetVelocity * InterceptTime;

// Aim the missile towards this location
AimDirection = ( InterceptLocation - MissileLocation ).normalized;
MissileVelocity = AimDirection * MissileVelocity.magnitude;

Note I didn't test any of this code, it's just from the top of my head from having to do this several times. Also, this won't give you the calculus-perfect interception time and location, but it's pretty close and can be refined by running another iteration of it on the newly-predicted intercept location.

more ▼

answered Apr 03, 2013 at 06:09 PM

3j- gravatar image

3j-
193 5 6 9

This is what I did previously. I tried to take into account the new position and how the distance may have grown wii it iteration.

The problem with your sample is that I could think I can hit my target and with the increase in distance from determining where my target is 't' amount of time along its path, and not actually hit it still.

Is there a constant way to incorporate this increase in distance when extrapolating the new target position for an extra amount of time?

Apr 04, 2013 at 03:30 PM 1337GameDev

Any other ideas?

Apr 05, 2013 at 02:44 PM 1337GameDev
(comments are locked)
10|3000 characters needed characters left

Maybe I don't fully understand the problem. But, if the missile is constantly tracking the target, you can simply pass the target's transform to the missile continuously in Update() and have the missile continuously update the vector it is moving along. (This vector is given in the first line of the example script in the previous comment).

This will make the missile behave more like an heat-seeking missile than a ballistic missile. But I am assuming that is what you want ?

more ▼

answered Apr 10, 2013 at 08:55 PM

recursiveAI gravatar image

recursiveAI
1

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x3128
x295
x202
x50
x32

asked: Apr 01, 2013 at 03:34 PM

Seen: 1881 times

Last Updated: Apr 10, 2013 at 08:55 PM