Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice
  3. Join us on November 16th, 2023, between 1 pm and 9 pm CET for Ask the Experts Online on Discord and on Unity Discussions.
    Dismiss Notice

Generating Dynamic Parabola

Discussion in 'Scripting' started by skaarjslayer, Nov 18, 2013.

  1. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    This is a math problem for you guys,

    I need to be able to dynamically create a parabolic curve in-game that an object follows. The "start" and "end" of the parabolic curve are points in 3D space that the object will travel from and towards. The "vertex", or "apex" of the parabola is located on the x-axis midway between those two points, and its y-value I want to be able to control with mouse input. All of this must be in 3D space.

    I'm open to suggestions on how to do this. And no, this isn't for a projectile, so using rigidbodies and gravity for this is useless to me.
     
    Last edited: Nov 18, 2013
    Hellid likes this.
  2. uy

    uy

    Joined:
    Jun 18, 2013
    Posts:
    55
    THIS IS IN C#



    So we know that a parabola is derived from the function y = x^2

    so every point in a parabola starting from the center is equal to (x, x^2) because y is literally equal to x^2

    so, how can we make this in unity?

    1: create a float to serve as x
    2: constantly change the position

    so the first part is pretty straightforward:

    Code (csharp):
    1. float x = 0;
    2. public GameObject theObject
    where theObject is the object you want to move (you can just drag him in)


    you can set x to anything, this is just the starting x point.


    in the Start(), lets set the vertex to 0, just by setting the object's position to (0,0,0)

    Code (csharp):
    1. theObject.transform.localPosition = Vector3.zero;
    so the second part is actually also pretty easy: (in the update)

    Code (csharp):
    1. x += 0.05f;
    2. theObject.transform.localPosition = new Vector3(x, Mathf.Pow(x, 2), 0);
    Mathf.Pow is the easiest way to just make a float to the power of a number. the x += 0.05 is just the quantity that will change in x each time. meaning the smaller it is, the longer it is going to take and the smoother it will be

    the reason i used localPosition is going to be explained in just a second

    This above script will make the object go up.

    if you wanted it to be flat on the ground and not change height, you would put the x in the Y position, and the x^2 in the Z position.


    so if you wanted to change the positioning/rotation of it, your easiest solution would be just to make your object a child to an empty, and then move that empty around to your desired location (this is why i used localPosition, so it is relative to the parent)



    of course, as far as customizing, you can change the x^2 to -x^2 (just making it negative) and it will go down

    you can also change the starting position of the object by just changing x at its initiation, and you can also change the direction of the path (not the curve, that's what would happen if i did -x^2) by doing x -= 0.05f instead.

    if you wanted to make it fatter, you need to multiply the x^2 by something less than 1, but greater than 0

    if you wanted to make it skinnier, you just need to multiply x^2 by something more than 1

    you can always just tweak around with the stuff

    this is all in global positioning, but really it's basically just 2d in a 3d world.

    have fun! hope I helped. If you have any more questions just ask
     
    Last edited: Nov 18, 2013
    ProGameDevUser likes this.
  3. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    This is sort of what I'm talking about, the problem for me though isn't in making actual parabolas, it's in generating a parabolic formula so that an object will pass through two specific points, simply tweaking in editor the "skinniness" or "fatness" of the parabola is not enough because the formula needs to work for any two points chosen in-game, on the fly; and it has to be exact.

    $example.png

    This is what I want, more or less. The player chooses a "ship", the ship's location is the first point on the parabola. The end position the player chooses is the second point, and is where the ship will travel to (along the curve). The curve of the parabola I want set by moving the mouse up-down to raise and lower the apex of the parabola, which will affect the curves.

    So far, I've tried to do it so I create a certain amount of points between the 2 positions, so the x's and z's of the various points along the line are already set. I just need the y-positions of those points to correlate to a parabolic curve which I thought I could set by moving the mouse up and down.... and then I can make an object move from point to point to emulate parabolic movement. I just can't figure out how to adjust the y-positions of the points to match that curve.
     
    Last edited: Nov 18, 2013
    Hellid likes this.
  4. uy

    uy

    Joined:
    Jun 18, 2013
    Posts:
    55
    In order for it to go up 42 meters i would just attach it to an empty...
    as far as the actual doing of it, i'm sure you could create an algorithm to have the points stay the same and the vertex change. It's late and I'm tired but I'll think about it tomorrow and see what I come up with
     
  5. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    The points staying and the same and raising the vertex, I can already do. I have that working. The problem is making the points in between those three points (that make up the curves) to follow the rise and fall of the vertex in a manner that creates a parabolic curve.
     
  6. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Does it have to be parabola? Sin waves so much simpler
     
    Hellid likes this.
  7. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    No it doesn't have to be a parabola, that gif shows exactly what I want. It has the three points, and curves relative to those 3 points which is exactly what I need. I don't know why I didn't think of sin waves.

    Is that your own example? Do you have code? I'd love to know how to implement this.
     
  8. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Yeah i saw the thread and thought id see what alternatives i could come up with
    Heres what I used to make that gif
    Code (csharp):
    1.     public Transform Ta, Tb, Ttop;
    2.     Vector3 a, b, midPoint;
    3.  
    4.     void Update () {
    5.         if ( Ta && Tb && Ttop ) {
    6.             a = Ta.position;
    7.             b = Tb.position;
    8.             midPoint = ( a + b ) / 2;
    9.             midPoint.y = Ttop.position.y;
    10.             Ttop.position = midPoint;
    11.         }
    12.     }
    13.  
    14.     void OnDrawGizmos () {
    15.         Gizmos.color = Color.red;
    16.         Gizmos.DrawLine( a, b );
    17.         Vector3 dir = b - a;
    18.         float count = 20;
    19.         Vector3 lastP = a;
    20.         for ( float i = 0; i < count+1; i++ ) {
    21.             Vector3 p = a + ( dir / count ) * i;
    22.             p.y = Mathf.Sin( ( i / count ) * Mathf.PI ) * midPoint.y;
    23.             Gizmos.color = i % 2 == 0 ? Color.blue : Color.green;
    24.             Gizmos.DrawLine( lastP, p );
    25.             lastP = p;
    26.         }
    27.     }
    28.  
    It's probably not gonna be exactly what you need, instead of looping over known sample points, youll probably want to rewrite it into a function like
    LerpParabola (Vector3 a, Vector3 b, float h, float t)
     
    Last edited: Nov 5, 2020
    kirbygc00, NikhilGhode and Hellid like this.
  9. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    Amazing, thank you. There are some problems though:

    It only works if points A and B are at a world y position of 0. I tried fixing it by doing this.

    Code (csharp):
    1. p.y = p.y + (Mathf.Sin( ( i / count ) * Mathf.PI ) * Ttop.position.y);
    This didn't work though, as the curve was no longer aligned with the mid point, etc. Any way to fix that so I could have points A and B anywhere in world space/have different y positions?
     
    Last edited: Nov 20, 2013
  10. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Done


    Code (csharp):
    1.     public Transform someObject; //object that moves along parabola.
    2.     float objectT = 0; //timer for that object
    3.  
    4.     public Transform Ta, Tb; //transforms that mark the start and end
    5.     public float h; //desired parabola height
    6.  
    7.     Vector3 a, b; //Vector positions for start and end
    8.  
    9.     void Update () {
    10.         if ( Ta  Tb ) {
    11.             a = Ta.position; //Get vectors from the transforms
    12.             b = Tb.position;
    13.  
    14.             if ( someObject ) {
    15.                 //Shows how to animate something following a parabola
    16.                 objectT = Time.time % 1; //completes the parabola trip in one second
    17.                 someObject.position = SampleParabola( a, b, h, objectT );
    18.             }
    19.         }
    20.     }
    21.  
    22.  
    23.     void OnDrawGizmos () {
    24.         //Draw the height in the viewport, so i can make a better gif :]
    25.         Handles.BeginGUI();
    26.         GUI.skin.box.fontSize = 16;
    27.         GUI.Box( new Rect( 10, 10, 100, 25 ), h + "" );
    28.         Handles.EndGUI();
    29.  
    30.         //Draw the parabola by sample a few times
    31.         Gizmos.color = Color.red;
    32.         Gizmos.DrawLine( a, b );
    33.         float count = 20;
    34.         Vector3 lastP = a;
    35.         for ( float i = 0; i < count + 1; i++ ) {
    36.             Vector3 p = SampleParabola( a, b, h, i / count );
    37.             Gizmos.color = i % 2 == 0 ? Color.blue : Color.green;
    38.             Gizmos.DrawLine( lastP, p );
    39.             lastP = p;
    40.         }
    41.     }
    42.  
    43.     #region Parabola sampling function
    44.     /// <summary>
    45.     /// Get position from a parabola defined by start and end, height, and time
    46.     /// </summary>
    47.     /// <param name='start'>
    48.     /// The start point of the parabola
    49.     /// </param>
    50.     /// <param name='end'>
    51.     /// The end point of the parabola
    52.     /// </param>
    53.     /// <param name='height'>
    54.     /// The height of the parabola at its maximum
    55.     /// </param>
    56.     /// <param name='t'>
    57.     /// Normalized time (0->1)
    58.     /// </param>S
    59.     Vector3 SampleParabola ( Vector3 start, Vector3 end, float height, float t ) {
    60.         if ( Mathf.Abs( start.y - end.y ) < 0.1f ) {
    61.             //start and end are roughly level, pretend they are - simpler solution with less steps
    62.             Vector3 travelDirection = end - start;
    63.             Vector3 result = start + t * travelDirection;
    64.             result.y += Mathf.Sin( t * Mathf.PI ) * height;
    65.             return result;
    66.         } else {
    67.             //start and end are not level, gets more complicated
    68.             Vector3 travelDirection = end - start;
    69.             Vector3 levelDirecteion = end - new Vector3( start.x, end.y, start.z );
    70.             Vector3 right = Vector3.Cross( travelDirection, levelDirecteion );
    71.             Vector3 up = Vector3.Cross( right, travelDirection );
    72.             if ( end.y > start.y ) up = -up;
    73.             Vector3 result = start + t * travelDirection;
    74.             result += ( Mathf.Sin( t * Mathf.PI ) * height ) * up.normalized;
    75.             return result;
    76.         }
    77.     }
    78.     #endregion
    79.  
    All you need is the parabola sampling function region, the rest is just for demo
     
    Novack, Groomer, kirbygc00 and 5 others like this.
  11. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Taking this approach also helped me figure out how to make them 'proper' parabolas, using x^2
    The curve is slightly different, shown here in pink and yellow

    Code (csharp):
    1.     Vector3 SampleParabola ( Vector3 start, Vector3 end, float height, float t ) {
    2.         float parabolicT = t * 2 - 1;
    3.         if ( Mathf.Abs( start.y - end.y ) < 0.1f ) {
    4.             //start and end are roughly level, pretend they are - simpler solution with less steps
    5.             Vector3 travelDirection = end - start;
    6.             Vector3 result = start + t * travelDirection;
    7.             result.y += ( -parabolicT * parabolicT + 1 ) * height;
    8.             return result;
    9.         } else {
    10.             //start and end are not level, gets more complicated
    11.             Vector3 travelDirection = end - start;
    12.             Vector3 levelDirecteion = end - new Vector3( start.x, end.y, start.z );
    13.             Vector3 right = Vector3.Cross( travelDirection, levelDirecteion );
    14.             Vector3 up = Vector3.Cross( right, travelDirection );
    15.             if ( end.y > start.y ) up = -up;
    16.             Vector3 result = start + t * travelDirection;
    17.             result += ( ( -parabolicT * parabolicT + 1 ) * height ) * up.normalized;
    18.             return result;
    19.         }
    20.     }
    21.  
     
  12. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    This is actually really awesome. I don't think I'd have been able to come up with this on my own. Thank you very much!
     
  13. the7347

    the7347

    Joined:
    Dec 29, 2012
    Posts:
    33
    I think something is wrong ...
     

    Attached Files:

    • $1212.gif
      $1212.gif
      File size:
      160.5 KB
      Views:
      2,854
    • $111.gif
      $111.gif
      File size:
      14.8 KB
      Views:
      2,734
    Last edited: Nov 21, 2013
    Pharaoh_ likes this.
  14. skaarjslayer

    skaarjslayer

    Joined:
    Oct 10, 2013
    Posts:
    108
    Actually I kind of want it the way hpjohn has it, because it generates a curve on an arbitrary axis relative to the 2 positions so the curve is even on both sides. I'd rather that for what I want.

    However, anyone who feels like they can accomplish what the7347 says should be correct, feel free to post it. That'd also be cool.
     
    Last edited: Nov 21, 2013
  15. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    Yeah, looks like the recent change to the forum code has removed some symbols from the code (posted before the forum changed)

    Specifically, in that code, line 5 is missing some && between the bits, should read
    if(Ta && Tb && Ttop){
     
  16. Fraconte

    Fraconte

    Joined:
    Dec 6, 2013
    Posts:
    327
    For the behaviour who want the7347 you simply have to ignore the second part of the SampleParabola (easy fix): :)
    Code (CSharp):
    1. if (true) //Mathf.Abs( start.y - end.y ) < 0.1f ) {
     
  17. Pavan Srivathsa

    Pavan Srivathsa

    Joined:
    Jun 6, 2014
    Posts:
    1
    @hpjohn
    Thank you so much. But how can I change the duration of flight of object???
     
    Last edited: Mar 17, 2015
  18. SpikyFruit

    SpikyFruit

    Joined:
    Oct 14, 2014
    Posts:
    1
    I found this thread and the code examples extremely helpful for a project I am working on.

    To answer @Pavan Srivathsa :

    You can change the duration of the flight of the object by changing the line:

    Code (CSharp):
    1. objectT =Time.time%1; //completes the parabola trip in one second
    to read:

    Code (CSharp):
    1. objectT =(Time.time / 10.0f) %1; //completes the parabola trip in ten seconds
     
  19. JOHNMCLAY

    JOHNMCLAY

    Joined:
    May 23, 2012
    Posts:
    38
    Hello readers of the future,

    If you're like me and found this thread super helpful, years after it was started, then here's a solution to create the parabola 'the7347' demonstrated in his comment:

    Change line:14 in hpJohn's sampleParabola function to: Vector3 up = Vector3.Cross(right, levelDirection);

    This is useful for applications such as trajectory predictions, which was of particular help to me.


    Here's the result from the original Line:14 - Vector3 up = Vector3.Cross(right, travelDirection);


    Here's the result from the modified Line:14 - Vector3 up = Vector3.Cross(right, levelDirection);


    Here's a comparison image:


    I hope this helps someone else as much as it helped me!
    Thanks again hpJohn for your great work! :D
     
    Last edited: Jun 19, 2015
    Novack, akaBase, Bunny83 and 2 others like this.
  20. asperatology

    asperatology

    Joined:
    Mar 10, 2015
    Posts:
    981
    Would you explain this bit, pointed out in the comments?

     
  21. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    see post #15
     
  22. asperatology

    asperatology

    Joined:
    Mar 10, 2015
    Posts:
    981
    Ah. I think it's fixed now. Thank you for clarifying!
    Code (csharp):
    1. &&
     
  23. mrkhanhit

    mrkhanhit

    Joined:
    May 19, 2015
    Posts:
    2
    I use model with rigibody,model can't move parabola
     
  24. mrkhanhit

    mrkhanhit

    Joined:
    May 19, 2015
    Posts:
    2
    i can use it with model have rigibody :(
     
  25. vegenarie

    vegenarie

    Joined:
    Jan 5, 2011
    Posts:
    287
    How can i render a trail for the object making the parabole in runtime?
     
  26. Hellid

    Hellid

    Joined:
    Feb 19, 2015
    Posts:
    2
    @hpjohn you're still alive? nice solution! ^^
    this helped me a lot when I found in january/february

    that time I was looking for alternatives to Rigidbody.AddForce... this works perfect
    so... since that the only thing I can't figure out is how stop movement loop and do it once time

    a some time ago I had even given up of this, but it's so amazing that I couldn't resist and had to ask ^^'
    can u help me understand?

    ( and sorry if my english isn't the best, but I had to try >< )
     
    Last edited: Sep 14, 2015
  27. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    To only make it travel once, you can stop calling the function
    Or Clamp time between 0 and 1
    Or disable the script
    It's alot simpler to have something NOT move than move
     
    Hellid likes this.
  28. Hellid

    Hellid

    Joined:
    Feb 19, 2015
    Posts:
    2
    ohhhhh thx, when you said..
    I looked at the code more carefully and realized..
    Code (CSharp):
    1. objectT = Time.time % 1;
    this mod returns variable value to 0 every time when pass in one integer.. and causes that loop LOL

    kkkkkkkkkkkkk would never work however much I tried stop without change that line
    and I remember mod execercises to find even and odd numbers... rsrs lack of attention ><

    so.... now it works..
    Code (CSharp):
    1. if(move == true)
    2. {
    3.   if(objectT > 1.0f) { objectT = 0.0f; move = false; }
    4.   else
    5.   {
    6.     objectT += (Time.deltaTime * 0.8f);
    7.     someObject.position = SampleParabola(a, b, Mathf.Clamp(objectT, 0.0f, 1.0f));
    8.   } //                                    *the height I make inside method
    9. }
    so that's all (for now) ;D
    and again......... thx a lot ><
     
  29. asperatology

    asperatology

    Joined:
    Mar 10, 2015
    Posts:
    981
    @Yasser_E
    Make a new thread instead, since it doesn't seem to be related to making dynamic parabolas, but rather customizing your scripts to make it look like a parabola.
     
  30. hpjohn

    hpjohn

    Joined:
    Aug 14, 2012
    Posts:
    2,190
    You also need to include an image in your new thread to accurately describe your wishes. Either you jump under gravity (and it naturally follows a parabola) or you stick to a parabola path
     
  31. Selzier

    Selzier

    Joined:
    Sep 23, 2014
    Posts:
    652
    @hpjohn @SkaarjSlayer and everyone else who has contributed, thank you!! Lots of good help here.

    I'm trying to convert this effect to a LineRenderer component and still be able to animate it as hp_john has. It's a bit tricky, as animating over multiple LineRenderer points is good fun:
    http://answers.unity3d.com/questions/796263/animate-linerenderer-with-many-positions.html

    And then adding the parabola shape to the LineRenderer is an enjoyable math problem:
    http://answers.unity3d.com/questions/370846/bezier-style-laser.html

    But now I'm having many difficulties implementing hp_johns animated example (between 2 gameobjects) working as an animated LineRenderer. I'll post here with an update or excited if someone else has done this and has a solution. Thanks!
     
  32. NikhilGhode

    NikhilGhode

    Joined:
    Mar 26, 2019
    Posts:
    1


    how to move object with addforce through parabola and how to make it horizontal, its in y axis and i want it in x axis, thank you
     
  33. Zapan15

    Zapan15

    Joined:
    Apr 11, 2011
    Posts:
    179
    Pure gold! Thank you very much!
     
  34. ThatOneCerqueira

    ThatOneCerqueira

    Joined:
    Nov 16, 2021
    Posts:
    1


    I gotta say, spent some time searching for some help with creating a method that would do this. I am a Game Dev student and although I do like math, I suck at most vectoral and angular math, and this just saved me a lot of time and made me understand what I was typing. Fot this I thank you and everyone who jumped in to help! You guys made my day!
     
  35. Idmah

    Idmah

    Joined:
    Mar 18, 2015
    Posts:
    9
    Hi All. Just found this... hopefully someone is still watching this thread.

    I'd like to apply this to a character / Enemy jumping to a point. but I would like to vary the angle and velocity to be as small as possible. So Jumps are not extremely high. as I think as human we want to do as little work as we can,. Thus animation would be more realistic.

    Apart from iterating through velocities to get a low angle is there a better solution? The math part of my brain melted years ago! Hahaha!
     
  36. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,814
    Please don't necro-post to threads with incomplete questions.

    Instead, start a new post. It's FREE!

    When you post, here is how to report your problem productively in the Unity3D forums:

    http://plbm.com/?p=220

    This is the bare minimum of information to report:

    - what you want
    - what you tried
    - what you expected to happen
    - what actually happened, especially any errors you see
    - links to documentation you used to cross-check your work (CRITICAL!!!)

    If you post a code snippet, ALWAYS USE CODE TAGS:

    How to use code tags: https://forum.unity.com/threads/using-code-tags-properly.143875/

    This just sounds like you haven't taken the time to do the right tutorials. Hurry now to Youtube and get busy.

    Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

    How to do tutorials properly, two (2) simple steps to success:

    Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That's how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.

    Fortunately this is the easiest part to get right: Be a robot. Don't make any mistakes.
    BE PERFECT IN EVERYTHING YOU DO HERE!!


    If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

    Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

    Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

    Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there's an error, you will NEVER be the first guy to find it.

    Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!

    Finally, when you have errors, don't post here... just go fix your errors! Here's how:

    Remember: NOBODY here memorizes error codes. That's not a thing. The error code is absolutely the least useful part of the error. It serves no purpose at all. Forget the error code. Put it out of your mind.

    The complete error message contains everything you need to know to fix the error yourself.

    The important parts of the error message are:

    - the description of the error itself (google this; you are NEVER the first one!)
    - the file it occurred in (critical!)
    - the line number and character position (the two numbers in parentheses)
    - also possibly useful is the stack trace (all the lines of text in the lower console window)

    Always start with the FIRST error in the console window, as sometimes that error causes or compounds some or all of the subsequent errors. Often the error will be immediately prior to the indicated line, so make sure to check there as well.

    Look in the documentation. Every API you attempt to use is probably documented somewhere. Are you using it correctly? Are you spelling it correctly?

    All of that information is in the actual error message and you must pay attention to it. Learn how to identify it instantly so you don't have to stop your progress and fiddle around with the forum.
     
  37. Idmah

    Idmah

    Joined:
    Mar 18, 2015
    Posts:
    9
    Ok. Will give the ton of parabolic / projectile tutorials another try!