• 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
0
Question by The_Magical_Kiwi · Oct 03, 2013 at 04:37 PM · c#curvebeziermathsturn based

Controlling the curvature of a Bézier curve

Hey guys,

I've been working on a curve generator for my game. I'm using it to plot a course for a ship.

First a little background; our ships have a maximum rotation of x and can move a maximum range of y per turn. They apply this range and rotation over a number of time segments, using either, neither or both types of transformation in each time segment.

While they can turn on their centre, it is optimal if they move and rotate at the same time where ever possible, however moving and rotating enforces a turning circle. With that in mind, I would like to control the curvature of my Bézier curve in order to find the optimal route from A to B while maintaining a specfic heading at both the start and end of the route.

alt text

I realised that the vector between the first point and the second point represents the starting heading and that the vector between the penultimate point and the last point control the end heading. I've also noticed that the distance between P0/P1 and P2/P3 controls the curvature (the closer the distance, the tighter the turn).

Taking into account all of the above, I have created a generator which creates a path between two points forcing a specified start and end heading and which (by use of colour) tells me if the curvature is to steep for a particular ship's turn ratio.

alt text

In this case, both the start and end heading are 315 (or -45).

I've been experimenting with changing the curve by adding in extra control points in between P1 and p2. This allows me to manually widen the curve reducing the tightness of the turn but I need to find some formula/algorithm for placing these extra control points which allows these curves be loosened/tightened automatically.

I was hoping someone could point me in the direction of some maths that might help?

Thanks in advance.

imp2.png (17.1 kB)
example.png (6.0 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

2 Replies

· Add your reply
  • Sort: 
avatar image
2

Answer by telcom_un · Jul 24, 2014 at 08:11 AM

In general it is not an easy task to control the curvature of a Bezier curve. If you look into the Bezier curvature formula you get, k(t) = (px_d py_dd - py_d px_dd)/(px_d^2 + py_d^2)3/2. As you see you need second derivative to control the curvature. It means without acceleration constrains you don't have meaningful control over the curvature. So at least 4th order Bezier is necessary for your task. I don't know any a-z approach to give you Bezier though. If you got it by now please share it with me.

Comment
Add comment · Show 1 · 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 The_Magical_Kiwi · Jul 28, 2014 at 03:58 PM 0
Share

It was taking me to long to complete, so in the end, I created a system where if after trying a few different things(changing the distance of p1 and p2) to get a valid curve, if I haven't found one, it puts in extra points which cause the ship to stop and rotate on the spot before continuing on the curve.

Eventually, I'll come back to it when I have more time, the system I have isn't good enough, but for now it works.

TL;DR: Haven't found a solution, put in a placeholder system for now until I have more time to spend on it.

avatar image
2

Answer by CHPedersen · Jul 24, 2014 at 08:22 AM

As telcom_un mentioned, Bezier curves at their simplest aren't the easiest to control. But thankfully, you're in an area of math which has a very rich toolkit of other curve functions you can use which might make it easier for you to control the curve. :)

Bezier curves are actually just a special case of the more general "Non-Uniform Rational Basis Spline", or NURBS curves for short. NURBS curves allow you to specify weights for the control points which, in layman's terms, behaves like gravity in that they pull the curve further towards them the higher the weight. If a point's weight is infinite, the curve passes through that point, regardless of where it is.

There is also another type of curve function called "Cubic Hermite Splines", which has a variant known as "Catmull-Rom Splines". These curves naturally pass through all the control points, and bend nicely in between.

Catmull-Rom splines is what Eric5h5 implemented for his Vectrosity Library, which can draw this type of curve in Unity, and which I've used extensively. :)

(Don't take that last part as an ad, I don't work for Eric or am affiliated with him in any way, I just like his library and can recommend it.)

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

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

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



Follow this Question

Answers Answers and Comments

17 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

Related Questions

How to get lateral normals of a bezier curve 1 Answer

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Subdivide Bezier Curves 3 Answers

Instantiate cube on network 0 Answers

  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges