|
Page 1 of 1
|
[ 15 posts ] |
|
Getting an angle from 2 points?
Author |
Message |
CaveCricket48
Joined: Tue Jun 12, 2007 11:52 pm Posts: 13144 Location: Here
|
Getting an angle from 2 points?
I'm trying to make a sphere accurately bounce with Lua. Currently, it'll work half of the time, while the other half it follows the same path before it struck an object backwards. The way I have this set up is that the orb casts 2 StrengthRays: one above it and one below it (The rays' position rotate with the orb's direction of velocity), and the rays' direction is the orbs' velocity direction. When both rays strike a terrain pixel, a new vector is created with the closest struck terrain pixel being the vector start. Then the orb's current velocity is added to the last vector to get the bounce direction. Bounce code snippet: Code: if SceneMan:CastStrengthRay((Vector(self.Pos.X,self.Pos.Y-3):AbsRotateTo(self.Vel)):Perpendicularize(),Vector(self.Vel.X,self.Vel.Y):SetMagnitude(20),0,self.anglechecka,0,0,true) and SceneMan:CastStrengthRay((Vector(self.Pos.X,self.Pos.Y+3):AbsRotateTo(self.Vel)):Perpendicularize(),Vector(self.Vel.X,self.Vel.Y):SetMagnitude(20),0,self.anglecheckb,0,0,true) then
if math.sqrt((self.anglechecka.X-self.Pos.X) ^ 2 + (self.anglechecka.X-self.Pos.X) ^ 2) > math.sqrt((self.anglecheckb.X-self.Pos.X) ^ 2 + (self.anglecheckb.X-self.Pos.X) ^ 2) then
self.determinedvel = Vector(self.anglecheckb.X-self.anglechecka.X,self.anglecheckb.Y-self.anglechecka.Y); self.determinedvel2 = self.determinedvel:AbsRotateTo(self.determinedvel+self.Vel); self.Vel = self.determinedvel2:SetMagnitude(self.ballspeed);
elseif math.sqrt((self.anglechecka.X-self.Pos.X) ^ 2 + (self.anglechecka.X-self.Pos.X) ^ 2) < math.sqrt((self.anglecheckb.X-self.Pos.X) ^ 2 + (self.anglecheckb.X-self.Pos.X) ^ 2) then
self.determinedvel = Vector(self.anglechecka.X-self.anglecheckb.X,self.anglechecka.Y-self.anglecheckb.Y); self.determinedvel2 = self.determinedvel:AbsRotateTo(self.determinedvel+self.Vel); self.Vel = self.determinedvel2:SetMagnitude(self.ballspeed); end end
|
Mon Nov 09, 2009 10:59 pm |
|
|
Grif
REAL AMERICAN HERO
Joined: Sat Jan 27, 2007 10:25 pm Posts: 5655
|
Re: Getting an angle from 2 points?
By your topic title I'd suggest math.atan2, because I'm too lazy to decipher your incredibly densely packed code. Seriously, expand it out some, dude.
|
Tue Nov 10, 2009 3:16 am |
|
|
zalo
Joined: Sat Feb 03, 2007 7:11 pm Posts: 1496
|
Re: Getting an angle from 2 points?
TLB is telling me there's a function for that in his orbit lands. Feel free to use it.
|
Tue Nov 10, 2009 4:15 am |
|
|
findude
Joined: Tue Dec 12, 2006 3:10 pm Posts: 495 Location: Uncertain quantum state
|
Re: Getting an angle from 2 points?
Wait how does the trig stuff differ from (pos1-pos2).AbsRadAngle?
|
Tue Nov 10, 2009 2:03 pm |
|
|
Darlos9D
Joined: Mon Jul 16, 2007 9:50 am Posts: 1512 Location: Tallahassee, FL
|
Re: Getting an angle from 2 points?
math.atan2 is definitely your friend. Of course, first you need to find the line between the two points, which is easy. Then you put it into math.atan2 as math.atan2(-Y, X). This should give you back the proper angle. The reason Y is negated is because in CC +Y is down, whereas lua's math functions assume +Y is up.
|
Tue Nov 10, 2009 3:04 pm |
|
|
Abdul Alhazred
DRL Developer
Joined: Tue Aug 11, 2009 5:09 am Posts: 395
|
Re: Getting an angle from 2 points?
I would actually advise against using atan2. IMHO using the functions provided by the API result in cleaner code, with many other advantages. Example: Code: local Range = SceneMan:ShortestDistance(self.Pos, Target.Pos, false) -- create a distance vector that takes x-wrapping in to consideration local angle = Range.AbsRadAngle -- the angle between self.Pos and Target.Pos local distance = Range.Magnitude -- the distance between self.Pos and Target.Pos
Edit: Used 'SceneMan.SceneWrapsX' in an incorrect way.
Last edited by Abdul Alhazred on Thu Nov 12, 2009 2:41 pm, edited 1 time in total.
|
Tue Nov 10, 2009 7:02 pm |
|
|
Darlos9D
Joined: Mon Jul 16, 2007 9:50 am Posts: 1512 Location: Tallahassee, FL
|
Re: Getting an angle from 2 points?
I swear to god I tried using ShortestDistance() and it failed to scene wrap.
AbsRadAngle/AbsDegAngle and Magnitude variables on Vectors are, sadly, news to me. Sigh...
|
Wed Nov 11, 2009 3:32 pm |
|
|
Geti
Joined: Sun Jul 13, 2008 9:57 am Posts: 4886 Location: some compy
|
Re: Getting an angle from 2 points?
you can give an argument in ShortestDistance() that allows scene wrapping. i think its the last one, and its boolean.
|
Wed Nov 11, 2009 9:18 pm |
|
|
Abdul Alhazred
DRL Developer
Joined: Tue Aug 11, 2009 5:09 am Posts: 395
|
Re: Getting an angle from 2 points?
Darlos9D wrote: I swear to god I tried using ShortestDistance() and it failed to scene wrap. I actually tested it to make absolutely sure that it works as expected, and yes it does. This was not a complete waste of time since I also noticed that the argument description of the third argument says " Whether to check if the passed in points are outside the scene, and to wrap them if they are.", meaning that the use of 'SceneMan.SceneWrapsX' that my post above previously had was wrong.
|
Thu Nov 12, 2009 2:40 pm |
|
|
Darlos9D
Joined: Mon Jul 16, 2007 9:50 am Posts: 1512 Location: Tallahassee, FL
|
Re: Getting an angle from 2 points?
Well, it's right in a way I think, but only if you're only interested in X wrapping. I mean, if the scene doesn't actually wrap and a point is outside of the scene is checked, wouldn't checking as if it were wrapped be bad?
Of course, maybe the function handles this on its own.
|
Thu Nov 12, 2009 7:07 pm |
|
|
TheLastBanana
DRL Developer
Joined: Wed Dec 13, 2006 5:27 am Posts: 3138 Location: A little south and a lot west of Moscow
|
Re: Getting an angle from 2 points?
To deal with that, you would just set the argument for whether to check or not to (SceneMan.SceneWrapsX or SceneMan.SceneWrapsY).
|
Fri Nov 13, 2009 1:35 am |
|
|
CaveCricket48
Joined: Tue Jun 12, 2007 11:52 pm Posts: 13144 Location: Here
|
Re: Getting an angle from 2 points?
I'm using math.atan2 for simplicity, and I'm doing something wrong. Code: self.bouncecheck = Vector(0,0); if SceneMan:CastStrengthRay(Vector(self.Pos.X,self.Pos.Y),Vector(self.Vel.X,self.Vel.Y):SetMagnitude(10),0,self.bouncecheck,0,0,true) then self.Vel = Vector(self.Vel.X,self.Vel.Y):RadRotate(math.atan2(self.bouncecheck.Y*-1,self.bouncecheck.X)); This makes the object bounce in strange directions.
|
Sat Nov 14, 2009 5:17 am |
|
|
Geti
Joined: Sun Jul 13, 2008 9:57 am Posts: 4886 Location: some compy
|
Re: Getting an angle from 2 points?
so, uh, whats that complex about Code: angle = SceneManager:ShortestDistance(vector1, vector2, true).AbsRadAngle ? that way you can be sure you arent ♥♥♥♥ something up with the angle.
|
Sat Nov 14, 2009 6:43 am |
|
|
CaveCricket48
Joined: Tue Jun 12, 2007 11:52 pm Posts: 13144 Location: Here
|
Re: Getting an angle from 2 points?
Now I get this: Attachment:
ScreenDump000.bmp [ 47.3 KiB | Viewed 4032 times ]
And I have this: Code: self.bouncecheckA = Vector(0,0); self.bouncecheckB = Vector(0,0); if SceneMan:CastStrengthRay(Vector(self.Pos.X,self.Pos.Y-3):AbsRotateTo(self.Vel),Vector(self.Vel.X,self.Vel.Y):SetMagnitude(10),0,self.bouncecheckA,0,0,true) and SceneMan:CastStrengthRay(Vector(self.Pos.X,self.Pos.Y+3):AbsRotateTo(self.Vel),Vector(self.Vel.X,self.Vel.Y):SetMagnitude(10),0,self.bouncecheckB,0,0,true) then angle = SceneManager:ShortestDistance(self.bouncecheckA,self.bouncecheckB,true).AbsRadAngle; self.Vel = Vector(self.Vel.X,self.Vel.Y):RadRotate(angle);
|
Sat Nov 14, 2009 5:56 pm |
|
|
Geti
Joined: Sun Jul 13, 2008 9:57 am Posts: 4886 Location: some compy
|
Re: Getting an angle from 2 points?
check if your rays are working the way you want them to by printing the results.
|
Sun Nov 15, 2009 12:57 am |
|
|
|
|
Page 1 of 1
|
[ 15 posts ] |
|
Who is online |
Users browsing this forum: No registered users |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|