- Home /
Predicting hit coordinates of a moving object
I've found myself experimenting with a challenging idea, and would appreciate some help.
Lets say I have a small pirate game, 2 ships have cannons and are moving. I'm trying to have the ships determine (predict) the coordinates to which they fire their cannons so that they collide with the other moving ship.
I cannot use the usual Raycast as it will shoot at the CURRENT coordinates of the enemy ship, not the predicted one.
You can cheat and use the current position plus current velocity of the ship B to predict its path x seconds in the future.
Answer by Cornelis-de-Jager · May 12, 2019 at 09:49 PM
I have shamelessly stolen this code from @peterho0218 on this thread: Click Me
private Vector3 predictedPosition(Vector3 targetPosition, Vector3 shooterPosition, Vector3 targetVelocity, float projectileSpeed)
{
Vector3 displacement = targetPosition - shooterPosition;
float targetMoveAngle = Vector3.Angle(-displacement, targetVelocity) * Mathf.Deg2Rad;
//if the target is stopping or if it is impossible for the projectile to catch up with the target (Sine Formula)
if (targetVelocity.magnitude == 0 || targetVelocity.magnitude > projectileSpeed && Mathf.Sin(targetMoveAngle) / projectileSpeed > Mathf.Cos(targetMoveAngle) / targetVelocity.magnitude)
{
Debug.Log("Position prediction is not feasible.");
return targetPosition;
}
//also Sine Formula
float shootAngle = Mathf.Asin(Mathf.Sin(targetMoveAngle) * targetVelocity.magnitude / projectileSpeed);
return targetPosition + targetVelocity * displacement.magnitude / Mathf.Sin(Mathf.PI - targetMoveAngle - shootAngle) * Mathf.Sin(shootAngle) / targetVelocity.magnitude;
}
Thanks for you help @Cornelis-de-Jager, works as intended!
Had to change the code a bit since one of the objects didnt have a Rigibdoy and was using Translate for movement, which doesn't work with physics.
Answer by wyatts · May 12, 2019 at 01:13 AM
Just spitballing here: I'd start with the variables,
the distance between boats
target boat velocity
cannon travel time
You can then use those variables to create a box collider that leads the target boat with an offset in the direction of movement that adjusts its offset based on the target boats velocity, and the distance between the target boat and the firing boat.
Then you can have the canons raycast out and when they hit that collider and fire, their cannonballs should hit the ship if its speed / direction / distance hasn't changed that much (and you've done your math right!).
But I'm sure there are a billion ways to do it
Interesting, i think that would probably give accurate results. The math required is a bit above my level, and i still havent had a full grasp of Quaternions. I'll give it a shot and post what i could come up with. Thanks for the idea @wyatts .
If you have any other ideas, please feel free to share :)
Another option is you could skip the box collider/raycast business and just measure your canons rotation from the target to the predicted-target (Vector3.Angle). You'd use the same variables just have it affect the rotation of the canon.
The math for either method shouldn't be too bad -- if you think about it you're just drawing a triangle between 3 points, the canon, the target ship, and the predicted target.
Also I'd note you don't need a deep understanding of quaternions for this. Basic functions like Quaternion.RotateTowards or Quaternion.LookRotation allow you to point your objects to vector3s without having to manually rotate angles. Good luck!
Your answer
Follow this Question
Related Questions
Find trajectory angle needed to hit an object 0 Answers
Changing position of a RayCast 1 Answer
Instantiating Object On Map 1 Answer