Jump to content
  • Advertisement
Sign in to follow this  
socialdev

2D Ai Turret Velocity Based Targeting (Worms/Scorced Earth/Etc)

This topic is 2584 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

In my game I have the math solved for targeting by first setting a velocity then determining the angle to hit a target already...

How would I go about solving it the other way? Determining the angle first then solving the power required to hit a specific point... I found this one formula below. AS3 doesn't have cos2, it only has Math.cos... Should I multiply the result of Math.cos times two or something? Total brain freeze here... Forgot my math. LoL!

"Shooter's position = (x[sub]0[/sub], y[sub]0[/sub])
Target's Position = (x[sub]1[/sub], y[sub]1[/sub])
Shooting angle = ?
Gravity = g

v[sub]0[/sub] = Sqrt( ( ( (x[sub]1[/sub]-x[sub]0[/sub])[sup]2[/sup] * g) * ( (x[sub]1[/sub]-x[sub]0[/sub]) * Tan ? - (y[sub]1[/sub]-y[sub]0[/sub]) ) ) / (2 * Cos[sup]2[/sup] ?) ) "

My conversion that is not working so far...

//BROKEN XY VERSION
public static function velocityToTarget(Location:Point, Target:Point, Gravity:Number, Angle:Number = 55):Number {
var xRange = Michael.gameMath.xDistanceBetweenPoints(Location,Target);
var yRange = Michael.gameMath.yDistanceBetweenPoints(Location,Target);
var Angle = Michael.gameMath.degToRad(Angle);
return Math.sqrt((xRange*xRange) * Gravity * (xRange * Math.tan(Angle) - yRange) / (2 * Cos2(Angle)));
}

Something is wrong here... Hmmm... It's both seriously overshooting by 10-1000x. I can tell it's almost working because when the target is closer the velocity is slower... Math is such a tease. Anybody got any ideas?

Share this post


Link to post
Share on other sites
Advertisement

In my game I have the math solved for targeting by first setting a velocity then determining the angle to hit a target already...

How would I go about solving it the other way? Determining the angle first then solving the power required to hit a specific point... I found this one formula below. AS3 doesn't have cos2, it only has Math.cos... Should I multiply the result of Math.cos times two or something? Total brain freeze here... Forgot my math. LoL!

"Shooter's position = (x[sub]0[/sub], y[sub]0[/sub])
Target's Position = (x[sub]1[/sub], y[sub]1[/sub])
Shooting angle = ?
Gravity = g

v[sub]0[/sub] = Sqrt( ( ( (x[sub]1[/sub]-x[sub]0[/sub])[sup]2[/sup] * g) * ( (x[sub]1[/sub]-x[sub]0[/sub]) * Tan ? - (y[sub]1[/sub]-y[sub]0[/sub]) ) ) / (2 * Cos[sup]2[/sup] ?) ) "

My conversion that is not working so far...

The first thing I would suggest is looking up "Rifleman's Rule", WikiPedia has a decent overview: http://en.wikipedia.org/wiki/Rifleman%27s_rule. This gives you an overview of the math behind hitting a target with non-equal height of start and end positions. Here's a snippet which doesn't do exactly what you want, it actually uses a fixed velocity and then calculates the two possible angles but hopefully once you get your head around the above Rifleman's Rule stuff this should give you a good starting point to experiment:

// R = range of entire arc.
// V = initial velocity.
// A = angle (in RADIANS) based on velocity.
// G = gravity constant.
// Ty = target y height
bool Ballistics::SolveAFromVRGTy( const float v, const float r, const float g, const float y, float& a0, float& a1 )
{
const float v2 = v*v;
const float v4 = v2*v2;
const float r2 = r*r;
const float partial = v4 - ( g * ( g*r2 + 2*y*v2 ) );

// If the partial is negative, there is not enough velocity to get to target.
if( partial <= 0.0f )
return false;

const float root = sqrtf( partial );
const float pos = ( v2+root ) / (g*r);
const float neg = ( v2-root ) / (g*r);

a0 = atanf( pos );
a1 = atanf( neg );
return true;
}


Some better definitions of the above. First, given a fixed velocity you can't always solve the equation, hence the bool return. Second, it returns 2 results, the first is the highest arc possible to hit the target and the second is the lowest (most direct) arc possible. The inputs are the desired velocity (V), the distance from the source and target points (i.e. the straight line which the arc will traverse) and the delta y between source and target (i.e. target.y-source.y, or the other way around, forget).

This is all based on the rifleman's rule I mentioned and if you get your head around that, this should be pretty easy to modify as desired to solve for the different variables. If you have problems modifying this let me know, but it should get you started in the correct direction.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!