Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Spherical coordinates for orbital motion


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 Shervanator   Members   -  Reputation: 128

Like
0Likes
Like

Posted 05 October 2012 - 08:39 AM

Hi, I've been working on getting some object to orbit around another object by using a spherical coordinate system. This has worked fine when the object is orbiting horizontally and vertically, however if you try to get the object orbiting diagonally it runs into issues with converting the spherical coordinates back to Cartesian coordinates.

All orbiting objects start with an initial theta, phi, and radius values and also a 2D heading vector to specify the orbit.

Then every frame this information is updated in the following way:

direction = Vector2.Normalize(direction);
theta += timeDelta * direction.X * orbitSpeed;
phi -= timeDelta * direction.Y * orbitSpeed;


pos.X = radius * (float)Math.Cos(theta) * (float)Math.Sin(phi);
pos.Y = radius * (float)Math.Cos(phi);
pos.Z = radius * (float)Math.Sin(theta) * (float)Math.Sin(phi);

pos.Normalize();
pos = radius * pos;

Where direction is the heading direction, radius is the distance away from the centre, timeDelta is the time since the last frame, orbit speed is a speed constant for the orbit, theta is the angle about the y-axis, phi is the angle about the x-axis, and pos is the final position vector for the object.

This works fine when direction = (1, 0) or (0, 1), however when it is made to equal (1, 1) then the object does weird orbits and it seems to be due pos.z not being calculated correctly.

Below is an image of the problem:

bad orbit.jpg

The white repeating boxes show the motion of the bad orbit.

The expected orbit can be seen below:

expected orbit.jpg

I will be very happy with any help I could get,

Thanks!

Edited by Shervanator, 05 October 2012 - 08:47 AM.


Sponsor:

#2 Cornstalks   Crossbones+   -  Reputation: 6991

Like
1Likes
Like

Posted 05 October 2012 - 09:31 AM

The problem is your setup for manipulating the values of phi and theta. The way you have it, if direction.y is ever not zero, then the satellite will always pass through the north and south poles (that is, the positions (0, 1, 0) and (0, -1, 0) assuming radius = 1 orbit) because phi will always exercise its full range of [0, pi], which if you look at the second picture, it's easy to see that phi never reaches 0 or pi (instead, phi looks like it's about in the range [pi / 4, 3 * pi / 4]). To properly model a circular orbit, most of the time phi doesn't exercise the full range [0, pi].

In other words, the way to properly manipulate phi and theta is much more complex than that. I don't have time to sit down and work it out though, as I have a test I'm supposed to be studying for. I just wanted to point out the problem so you/others can start investigating.
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#3 luca-deltodesco   Members   -  Reputation: 637

Like
0Likes
Like

Posted 05 October 2012 - 09:31 AM

You are changing the spherical coordinates linearly, and the first diagram is exactly what you get by doing that.

#4 Shervanator   Members   -  Reputation: 128

Like
0Likes
Like

Posted 05 October 2012 - 09:51 AM

So any suggestions as to how I should go about manipulating phi and theta correctly to achieve the orbit in the second picture?

#5 luca-deltodesco   Members   -  Reputation: 637

Like
0Likes
Like

Posted 05 October 2012 - 11:03 AM

Really, it's going to be WAY easier to just not use spherical coordinates.

For ideal circular orbit (and 'very' easily expandable to elliptical orbits), in a circle defined by an axis of rotation (y) through the planet, you can describe the position of the orbiting body with:

r * (x * cos(theta) + z * sin(theta)) where (x, y, z) is a basis determined by y, and a radius r.

#6 apatriarca   Crossbones+   -  Reputation: 1743

Like
0Likes
Like

Posted 05 October 2012 - 11:12 AM

I wouldn't use the spherical coordinates, but store the radius and the rotation mapping the object in (radius, 0, 0) and tangent space basis (0, 1, 0), (0, 0, 1) to the current position and orientation (where I suppose that the first basis vector is the direction the object is heading). To move the object you either define how the current rotation change in time or simply compose the current rotation with the new local one.

If all you want is an object orbiting around a point/planet maintaining some fixed perpendicular vector, you can simply define the current rotation as rotations around that vector with increasing angles.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS