Converting a rotation to spherical coordinates

Started by
9 comments, last by Omid Ghavami 17 years, 1 month ago
I have a large sphere, with the player walking along the surface of it. I have my mouse look all set up, so the player can look in different directions. I have the player's position stored in a custom spherical coordinate class that determines position based on North/South and East/West components, with these components mod'ed so you can wrap around the sphere. Given the direction the player is currently looking, I want to modify the player's spherical coordinates. That means translating a velocity vector pointing along the mouse look direction into an angular velocity in N/S and E/W terms (spherical coordinates). At the moment, here's how I'm imagining it working: First, I remove the up/down from the mouse look rotation. This gives me a direction that is in the plane tangent to the player's position on the sphere. Second, the "up" vector for the player's camera is simply the normalized current position of the player. Then I find the angular velocity, which is w = (velocityscalar * direction) cross (camera's up vector) / (sphere's radius) The angular velocity is now basically in angle axis form. From this I need to convert to two component rotations, one along N/S and another along E/W. How do I do this?
[size=2]Darwinbots - [size=2]Artificial life simulation
Advertisement
I'm still looking for an answer; I'm really stumped. I could extract yaw, pith, and roll elements, but I'm not sure how to use those to convert to a change in longitude/latitude.
[size=2]Darwinbots - [size=2]Artificial life simulation
Just glanced at it quickly, so might be incorrect, but the solution as I see it is pretty simple:

Setup the equation

v = w X r

v is known, r is known, w is sought. Solve for w.
Then project w onto your axes to determine the contribution around the axes of interest.
Best regards, Omid
Quote:Original post by Omid Ghavami
Then project w onto your axes to determine the contribution around the axes of interest.


Care to elaborate?
[size=2]Darwinbots - [size=2]Artificial life simulation
Quote:Original post by Numsgil
Quote:Original post by Omid Ghavami
Then project w onto your axes to determine the contribution around the axes of interest.


Care to elaborate?


Orthogonal projection of u on v != 0 is given by
     <u, v> u' = ------  v      |v|2 

EDIT: hmpf, bold text doesn't show inside code clause, too bad.

Where <a,b> is the inner product (dot product) and |v| is the 2-norm, ie the length of vector.

EDIT: noticed the equation don't look that great (When is GD going to support LaTeX? [wink]), if it's unclear it says:

The inner product (dot product) between u and v divided by the squared norm of v, unless v is normalised in which case the divition will be by 1 and hence unnecessary. This will be a scalar which is then multiplied by the vector v to produce the orthogonal projection of u on v, here donted u'
Best regards, Omid
Maybe I should also explain why it is so, it sucks to just be handed equations without explanation [smile]

<u, v> = |u| * |v| * cos(a)

Where a is the angle between the vectors. Now what's interesting here is that we see the term |u| * cos(a), which by trigonometry we know will be the component of u in v's direction.

   % u  / //) a------> v


So if we now divide <u, v> by |v| we get |u| * cos(a), which is u magnitude in v's direction. This is however a scalar value but we want a vector. So we want a vector in v's direction whose magnitude is |u| * cos(a). So we normalise v by dividing it with |v| and then multiply the normalized vector with |u| * cos(a).

The end result is as stated earlier

<u, v> / |v| * v / |v| = <u, v> v / |v|2
Best regards, Omid
It's not the math for the projection that's throwing me, it's what to project on to. There are 3 possible planes of interest. z = 0, y = 0, and x = 0. I have only 2 terms, phi and theta (or longitude and latitude).

The issue is also complicated by the fact that facing North on the equator, and facing north 1 mm from the North Pole, give almost orthogonal directional vectors in euclidean space. But they are the same direction in geodesic space (that is, the topology of the surface of a sphere). Very confusing.

What's really happening is that the rotation is being defined by the player's position on the sphere. The great circle that passes through the player's position and is parallel in direction to the player's direction at the player's position forms the forward/backward rotation. The great circle perpindicular to this forms the left/right rotation. The forward/backward great circle probably coudl be corresponded pretty well to longitude. Both are great circles.

Latitude is not built from great circles. So I don't think an easy correspondance exists.

I dunno, the whole thing just stumps me.
[size=2]Darwinbots - [size=2]Artificial life simulation
Spherical coodinates have a base consisting of three unit vectors, given by

er = (sin(θ)cos(φ), sin(θ)sin(φ), cos(θ))
eθ = (cos(θ)cos(φ), cos(θ)sin(φ), -sin(θ))
eφ = (-sin(φ), cos(φ), 0)

v(R,θ,φ) = Rer + θeθ + φeφ

EDIT: In case it was unclear, for θ project on eθ and for φ project on eφ.

Or even better after giving it some thought perhaps the best way would be to:

v = vRer + vθeθ + vφeφ

Where
vR = dR/dt
vθ = R * dθ/dt
vφ = R * dφ/dt * sin(θ)

Where v is known in cartesian coordinates, the base vectors are known for the current position, since θ and φ are known for the current position. So you get three equations with two unknown, namely dθ/dt and dφ/dt, since you already know dR/dt = 0. Solving that will give you the change in θ and φ.

[Edited by - Omid Ghavami on March 13, 2007 11:46:55 AM]
Best regards, Omid
That looks like a solution! I'll give it a try and see waht I get. In the mean time, where did the base vectors come from? I've never seen them before, and I've been working with sphericeal coordiantes casually for a while, not to mention having covered them in calculus.
[size=2]Darwinbots - [size=2]Artificial life simulation
First of all there are different conventions for θ and φ, so don't take all the equation literary. I'm using the convention that θ is measured from R to the z-axis, whilst φ is measured from the projection of R in the x-y plane to the x-axis.

The base unit vectors are then defined so that:
eR is in the direction in which movement would increase R but not alter θ and φ.

eθ is in the direction in which movement would increase θ but not alter R and φ.

eφ is in the direction in which movement would increase φ but not alter R and θ.

Note that these base vectors are only valid for the state, they will change change as soon as R changes. Now since eR points in the direction of our point, the position of a given point is entirely determined by R = R eR.
It won't however remain that simple when we take the time derivative, since eR changes with time. Taking the time derivate we will reach the presented equation for the velocity v. The derivation is pretty straight forward but it's difficult to type it in here since there is no support for math expressions, so I won't do that.
We now have an expression for the time derivative of the position vector, and we also know the numerical values for the components of the velocity in cartesian coordinates. We also know the spherical coordinate base vectors in cartesian coordinates, so we get three equations, one for each cartesian component. There will be three unknown, these are dR/dt, dθ/dt, dφ/dt. Three equations, three unknowns, sounds promising. We also happen to know that dR/dt = 0, so we only need to consider 2 of the equations.
Solving this will give us what we sought.
Best regards, Omid

This topic is closed to new replies.

Advertisement