[Gambas-user] translating planar coordinates relative to point's angle
Doriano Blengino
doriano.blengino at ...1909...
Tue Mar 15 22:03:56 CET 2011
Kevin Fishburne ha scritto:
> Just to be clear on what -should- be happening, here's an example.
> Player is facing up (0 degrees): left stick pushed up moves up, pushed down
> moves down, pushed left moves left, pushed right moves right.
> Player is facing right (90 degrees): left stick pushed up moves right,
> pushed down moves left, pushed left moves up, pushed right moves down.
>
Well, you need to rotate the data from the left joystick around the
player. This is the formula of rotation:
xr := xp*g92cos - yp*g92sin;
yr := xp*g92sin + yp*g92cos;
Sorry, I took them from an old pascal program, but I explain.
The above code rotates a point (xp; yp) around the origin, by a given
angle "g92", of which g92cos and g92sin are the cosine and sine. The new
rotated point is (xr; yr). Please note that 0 degrees is toward right,
90° up, 180 left, but a computer screen is flipped up side down (which
is not a rotation but a mirror), so the y coordinates must be mirrored
(choose the opposite sign if a coordinate is relative, or subtract the
coordinate from the maximum Y coordinate if absolute). In addition, you
say that 0° is up, and 90° right, which is both mirrored and rotated in
respect to the canonical trigonometry... this kind of things can drive
me crazy... :-)
Back to the problem. If I well understand, at every frame you take the
left joystick, and apply its "command" to the player. But the direction
of the movement depends on the orientation of the player. Well, you take
the left joystick data (x and y) and rotate them using the formulas
above, basin on current player orientation. This way, when the left
joystick slides up, the player will always move ahead, along its current
direction. Now I will make an example.
Suppose your player is at X=0 and Y=0, facing up (0 degrees), and you
move the left joystick "up". You receive y=10 and x=0 from the left
joystick. The above formula gives (cos(0)=1, sin(0)=0):
xr := xp*g92cos - yp*g92sin = 0*1 - 10*0 = 0
yr := xp*g92sin + yp*g92cos = 0*0 + 10*1 = 10
So you add 0 to X and subtract 10 from Y (or add "-yr" to Y). The player
moves up. Note that X is added and Y is subtracted because of the screen.
Now, suppose that the player instead is facing right (90°). The formula
gives (cos(90)=0, sin(90)=1:
xr := xp*g92cos - yp*g92sin = 0*0 - 10*1 = -10
yr := xp*g92sin + yp*g92cos = 0*1 + 10*0 = 0
So you add -10 to X, and subtract 0 from Y. The player moves left. Why
not to the right? Because if you rotate your head to the left, you turn
90 degrees, and if you turn your head to the right, you turn -90°. So if
you say that 0° is up and 90° is right, there is something wrong. I hope
that what I write is comprehensible...
I don't know at which extent your program is already using this strange
coordinates, so I prefer to elaborate no more (a little tired this
night), but by inverting the readings from the joystick, and/or swapping
X and Y from the joystick, or by using "90-angle" instead of "angle"
when calculating cos() and sin(), you should quickly solve without
touching the rest of the program. I presume you should use both
"90-angle" and subtract from Y instead of adding to it, but I am not
sure - sorry. In a few days I will go to visit those URLs you posted, I
am always curious about math and videogames :-)
Cheers,
Doriano
More information about the User
mailing list