Homing missiles math
BlitzMax Forums/BlitzMax Beginners Area/Homing missiles math
| ||
| EDIT Solved it, I found an old B3d file :P The solution: Method Homing() While Dir > 360 Dir:-360 Wend While Dir <= 0 Dir:+360 Wend Local TE# = RotaryDir( Dir# , iDir) If TE# < 0 Then Dir:- Turnrate*Delta.Time If TE# > 0 Then Dir:+ Turnrate*Delta.Time EndMethod This is the function I found that solved the problem. it returns the closest angle to turn to get to target, negative or Positive. Probably taken from the code archives a very long time ago. |
| ||
| <shameless plug>and if you want to do it in 3d :D wander over to my site and check out my quat pointing tutorial</shameless plug> |
| ||
| http://www.blitzbasic.com/Community/posts.php?topic=55665&hl=guided |
| ||
| The example linked by hub is a bit limited in that it doesn't actually include any turn rate limiting, i.e the missile will always point immediately at the target. I've hacked the two together for a slightly nicer example. Play with missilespeed and turnrate for some fun. The higher the turnrate the smarter the missile Grab this image: ![]() |
| ||
| my homing missile code. and hub, you code is useless for a missile, don't have head and tail.
Strict
Graphics 640,480
SetMaskColor 255,0,255
AutoMidHandle True
Global Image:TImage=LoadImage("Missile.png",MASKEDIMAGE)
Global Angle:Int
Global Acel:Int=3
Global TurnSpeed:Int=5 '0 fast , 5 slow
Global X:Int
Global Y:Int
Global TargetX:Int
Global TargetY:Int
While Not KeyHit(KEY_ESCAPE)
TargetX=MouseX()
TargetY=MouseY()
movemissile()
Cls
SetRotation Angle
DrawImage Image, X,Y
SetRotation 0
Flip
Wend
Function movemissile()
If Sqr((X-TargetX)^2+(Y-TargetY)^2)>20 Then
Local GotoAngle:Int = ATan2(Y-TargetY,X-TargetX)
Local tmpAngle:Int=GotoAngle-Sgn(GotoAngle-Angle)*360
If Abs(GotoAngle-Angle)>Abs(tmpAngle-Angle) Then GotoAngle=tmpAngle
If Angle<>GotoAngle Then Angle:-Sgn (GotoAngle-Angle)*(180-Abs(GotoAngle-Angle))/(1+Acel*TurnSpeed)
If Angle=>360 Then Angle:-360 Else If Angle<0 Then Angle:+360
X:+Cos(Angle)*acel
Y:+Sin(Angle)*acel
EndIf
EndFunction
|
| ||
| BlackSp1der's is a far more elegant solution :) |
