[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] how to "think rotation" on a longitude-latitude reference system ?



Hi All,


" i'm not expert programmer, just a biologist student :-/ with self-teached python experience
so apologize my questions if they are based on wrong assumptions "

for my study i need to write a code to inteface a  joystick device 
with an open source application similar to google earth.

this application is a 3d globe based on openscenegraphic (OSG),
it has a "tcp listner interface" that accept xml message to move a camera-view around the globe

the message to move the globe is something like :

go_to_lat_lon(latitude longitude roll picth head)

i tried to code in python using pygame, the results is (my fault) an "ugly" code
that is not able to update the position according with heading changes (view direction).

exactly i have a 3 axis joystick 

axis_x -> +/- longitude
axis_y -> +/- latitude
axis_z -> +/- 0-360° (heading)
axis_v = 0-1 (speed)

the code i wrote use the axis_x and axis_y to change longitude and latitude and axis_z to change the view direction.

but it is totally wrong beacouse if i have heading = 0 = 360 (e.g. look to north)
the code works as aspected ... but if i change direction (view turns) the axis code is not update.
so if i look yo east and put the joysrick up (go ahead) it don't go to east .. but go ever to north.

move the axis_y up move the planet to north
move the axis_y down move the planet to south
move axis_y left and right move the planet to west and east

but beacouse my code is totally separated by the heading changes, if i change heading the joystik x/y axis action is immutate.

this beacouse i connect the x/y action to a code that simply do an increase/decrease lon-lat values.

increase : 

for i in arange(j , j+1):
lati = [sum(zlat)]
a = abs(axis_v) * abs(axis_x)
lati.insert( i+1,a )
zlat = array(lati)
lat = sum(zlat) 
j = 0.1

for i in arange(j , j+1):
lati = [sum(zlat)]
a = abs(axis_v) * abs(axis_x)
lati = [sum(lati) - a]
zlat = array(lati)
lat = sum(zlat)
j = 0.1

i used the increase decrease code to handle all the avaiable condition, North, South, East, Ovest, Ne, Nw , Se , Sw :

1)

axis_x < 0
axis_y == 0

2)

axis_x == 0
axis_y > 0

3)

axis_x > 0
axis_y == 0

4)

axis_x == 0
axis_y < 0

5)

axis_x < 0
axis_y > 0

6)

axis_x > 0
axis_y > 0

7)

axis_x > 0
axis_y < 0

8)

axis_x < 0
axis_y < 0

i hope exists already a function in opengl that can help me to solve this problem
reading a lot on google seems my problem can be solved using complex math like quaternion
or rotation around an arbitrary axis.

i can ignore roll and pich, beacouse i can chenge them using the joystick hat .. an roll and pich are ininfluent on the lon-lat position ... while the heading is strictly related to the position beacouse it represent the movment direction.

plese apologize again my ugly code, this what i'm actually using :


this the results :


while here i tried to learn quaternion .. but my brain is not hable "yet" to undstand how to works with quaternion in a 
"longitude - latitude" space :-(


i hope some one can help me!
please i'm italian so it is a bit hard to find the right word to describe my problem
for eny more detailed explanaton, please ask me where i need to give more precise informations.

thanks to help me!

ciao,

Massimo.