• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
9
Question by yetanotherday · May 06, 2012 at 02:07 AM · shootingballtrajectorythrow

Calculating ball trajectory in full 3d world

Hello

We have quite common problem but we couldn’t figure out any working solution any that fits (all of those bits of code we found on unity forums doesn’t tell us much because we are not programmers). If that’s possible we prefer code in javascript.

Our situation:

  1. Players character is grenadier in full 3d world (he can jump and walk on different levels of high)

  2. Players sees that character as third person from isometric-like point of view (similar to most crpg games like Diablo)

  3. In any time player can throw grenade to any place within range by clicking mouse button on the ground

  4. We know how to find coordinates of player and that click on the ground

    Our problem:

  5.  We don’t know how to calculate the trajectory of thrown grenade in 3d world. Grenade should start from characters position and ends on the clicked ground (right now its misses badly).
    
  6.  We would like to have control over speed, angle and distance in which player can throw grenade.
    

This doesn’t have to be 100% precise , we prefer something that works and works really fast.

Image for better understanding our problem:

alt text

Those two clips can show you what we searching for:

http://www.vimeo.com/8900520 – this one have something we are looking for

http://www.youtube.com/watch?v=kNabvLyUXzI#t=0m32s - here is “feel” of throw we are looking for

Thanks SO much!

trajectory.jpg (21.4 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

8 Replies

· Add your reply
  • Sort: 
avatar image
28

Answer by Tomer-Barkan · May 14, 2013 at 12:36 PM

Actually there's a very simple way using basic physics formulas, with no errors whatsoever regardless of the elevation:

 private Vector3 calculateBestThrowSpeed(Vector3 origin, Vector3 target, float timeToTarget) {
     // calculate vectors
     Vector3 toTarget = target - origin;
     Vector3 toTargetXZ = toTarget;
     toTargetXZ.y = 0;
     
     // calculate xz and y
     float y = toTarget.y;
     float xz = toTargetXZ.magnitude;
     
     // calculate starting speeds for xz and y. Physics forumulase deltaX = v0 * t + 1/2 * a * t * t
     // where a is "-gravity" but only on the y plane, and a is 0 in xz plane.
     // so xz = v0xz * t => v0xz = xz / t
     // and y = v0y * t - 1/2 * gravity * t * t => v0y * t = y + 1/2 * gravity * t * t => v0y = y / t + 1/2 * gravity * t
     float t = timeToTarget;
     float v0y = y / t + 0.5f * Physics.gravity.magnitude * t;
     float v0xz = xz / t;
     
     // create result vector for calculated starting speeds
     Vector3 result = toTargetXZ.normalized;        // get direction of xz but with magnitude 1
     result *= v0xz;                                // set magnitude of xz to v0xz (starting speed in xz plane)
     result.y = v0y;                                // set y to v0y (starting speed of y plane)
     
     return result;
 }

Simply call the function with the origin position, target position and how long you want the throw to take (which will affect the angle). Then apply the result on the object you want to throw with rigidbody.AddForce(throwSpeed, ForceMode.VelocityChange);

Comment
Add comment · Show 10 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Mangesh21 · Oct 03, 2013 at 05:53 PM 0
Share

what is toHoopXZ in above script??

avatar image Tomer-Barkan · Oct 09, 2013 at 05:00 PM 0
Share

was supposed to be toTargetXZ.

avatar image Velo222 · Oct 30, 2013 at 06:50 PM 2
Share

WOW, the function tbkn posted is amazing for me! Thank you very much for posting that. $$anonymous$$an there's some smart people in this world haha.

Just so other people know, the "calculateBestThrowSpeed()" function tbkn posted works great. $$anonymous$$y projectile reaches the static target point AND I can control how quickly. Thank you so much tbkn.

avatar image -chris · Jan 31, 2014 at 11:42 AM 0
Share

I had to change 0.5f to 1f because my projectiles were only reaching half-way, but 1f does the trick for me! Thanks

avatar image BjoUnity3d · Mar 15, 2014 at 11:17 AM 2
Share

I didn't have to change anything, tbkn's script and instructions worked perfectly. Velo222, my feelings exactly. I've been working on this all night and this just solved everything. Nice work tbkn.

Show more comments
avatar image
3

Answer by Piflik · May 10, 2012 at 09:16 PM

Probably you know all this already, but still...you can calculate a parabola given 3 points. You already have two of them: the player's position and the target point. The third would be (roughly) the apex, take half of the distance between the player and the target and the height you want (maybe with player control over the height...how long he presses the mouse button, for example, so he can lob the grenade over walls or even through windows with some exercise).

It would be a good idea to reduce the equation to 2 dimensions. You eliminate the direction and only use the distance. The first point would be (0, chracter.height), the second would be (distance, 0), the last one (distance/2, throw.heigth).

To calculate the parabola you have Ax² + Bx + C = y. Put your three coordinates in there, and you can calculate A, B and C.

You now have the trajectory your grenade should follow, minus the direction, but it should be easy to rotate it around the player once it is calculated. You probably have to control the grenade completely to follow the trajectory. The physics might not give you the desired results. You could try to calculate the starting velocity you need from the height and the distance, but I don't know how difficult that will be and how reliable.

One thing that could be a problem, is to mirror the trajectory at obstacles...don't have a spontaneous idea for this one.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
2

Answer by fafase · May 06, 2012 at 07:04 AM

check there: http://hyperphysics.phy-astr.gsu.edu/hbase/traj.html#tra7

Then, you will have to compute when they are on different levels, y0 becomes the y of the grenadier. Check "where will it land" at the bottom of the page for this issue.

Also, add the z position to your calculation in the same fashion as x.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
  • ‹
  • 1
  • 2

Your answer

Hint: You can notify a user about this post by typing @username

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

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

28 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Show trajectory of a bouncing ball 0 Answers

How to predict where the ball will land after being hit by bat? 4 Answers

Can i make a bullet spawn and follow a designed path via animation 0 Answers

Ball not throw proper direction unity3d? 0 Answers

Throw a ball in target bucket with swipe but with one drop Unity3D 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges