I Got a working example using the atan2 method. Then I finaly understood Aligntovector command, so I thought I might share a working Aligntovector example.
The ship in the example code uses rocket thrust to move. Giving aceleration the longer you press the direction key.
This works in 3D, and you can even do loop the loops OK!
Global title$="Space Movement Sample"
AppTitle title$
Graphics3D 800,600
SetBuffer BackBuffer()
Global msecs=MilliSecs()
Global you=CreatePivot()
PositionEntity you,0,40,-150
Global cam=CreateCamera(you)
PositionEntity cam,0,0,0
CameraRange cam,1,20000
CameraClsColor cam,120,120,170
light=CreateLight(2)
PositionEntity light,0,200,0
;-- ground
plane= CreatePlane()
PositionEntity plane,0,-20,0
EntityPickMode plane,2,0
planetex=gridtex(256,16,4)
EntityTexture plane,planetex
ScaleTexture planetex,256,256
zero = CreatePivot()
PositionEntity zero,0,30,0
ZeroX#=EntityX(zero,1)
ZeroY#=EntityY(zero,1)
ZeroZ#=EntityZ(zero,1)
pole = CreateCylinder(22,1,zero)
ScaleEntity pole,1,30,1
EntityColor pole,210,210,10
pole2 = CreateCylinder(22,1,zero)
EntityColor pole2,10,210,210
RotateMesh pole2,90,0,0
ScaleMesh pole2,1,1,20
pole3 = CreateCylinder(22,1,zero)
EntityColor pole3,10,10,210
RotateMesh pole3,90,90,0
ScaleMesh pole3,20,1,1
;-- Ship
Ship = CreateCone(22,1)
RotateMesh Ship,90,0,0
ScaleMesh Ship,4,4,10
EntityColor Ship,250,190,190
wings = CreateCone(22,1,Ship)
RotateMesh wings,90,0,0
ScaleMesh wings,14,.4,6
EntityColor wings,250,190,190
Head=CreateSphere(22,Ship)
ScaleMesh Head,2,3,4
EntityColor Head,20,255,25
PositionEntity Head,0,1,-1.5
shiptex=Gridtex(64,8,4,155,100,100,100,100,205)
EntityTexture ship,shiptex
Wingtex=Gridtex(64,4,2,205,100,100,100,100,205)
EntityTexture wings,wingtex
inertia# =.999
Excel# = .01
Lexcel# = .01
Rexcel# = .01
Lift# = .01
TurnSpeed# = .01; How fast Ship turns to point in Direction of Travel
While Not KeyHit(1)
If KeyHit( 17) Then wf = Not wf : WireFrame wf
ms = MilliSecs() - start
Excel# = Excel + MouseZSpeed()*.001
If MouseDown(1) Or KeyDown(200) Then ;back rocket
TFormVector 0,0,Excel,Ship,0 ;convert force to global space coords
RearRocketForceX#=TFormedX#()
RearRocketForceY#=TFormedY#()
RearRocketForceZ#=TFormedZ#()
Else If KeyDown(208) Then
TFormVector 0,0,-Excel*.5,Ship,0 ;reverse (Forward thrusters)
RearRocketForceX#=TFormedX#()
RearRocketForceY#=TFormedY#()
RearRocketForceZ#=TFormedZ#()
Else
RearRocketForceX#=0
RearRocketForceY#=0
RearRocketForceZ#=0
End If
If KeyDown(203) And( Not KeyDown(157)) Then ;rightside rocket (to go left!)
TFormVector -LExcel,0,0,Ship,0
RRocketForceX#=TFormedX#()
RRocketForceY#=TFormedY#()
RRocketForceZ#=TFormedZ#()
Else If KeyDown(203) And KeyDown(157) Then
TurnEntity Ship,0,1,0
Else
RRocketForceX#=0
RRocketForceY#=0
RRocketForceZ#=0
End If
If KeyDown(205)And (Not KeyDown(157)) Then ;leftside rocket (to go right!)
TFormVector RExcel,0,0,Ship,0
LRocketForceX#=TFormedX#()
LRocketForceY#=TFormedY#()
LRocketForceZ#=TFormedZ#()
Else If KeyDown(205)And KeyDown(157) Then
TurnEntity Ship,0,-1,0
Else
LRocketForceX#=0
LRocketForceY#=0
LRocketForceZ#=0
End If
If MouseDown(2) Then ;lift rocket
TFormVector 0,lift,0,Ship,0
LiftRocketForceX#=TFormedX#()
LiftRocketForceY#=TFormedY#()
LiftRocketForceZ#=TFormedZ#()
Else If MouseDown(3) Then ;down rocket
TFormVector 0,-lift,0,Ship,0
LiftRocketForceX#=TFormedX#()
LiftRocketForceY#=TFormedY#()
LiftRocketForceZ#=TFormedZ#()
Else
LiftRocketForceX#=0
LiftRocketForceY#=0
LiftRocketForceZ#=0
End If
ForceX#=RearRocketForceX + RRocketForceX# + LRocketForceX# + LiftRocketForceX#
ForceY#=RearRocketForceY + RRocketForceY# + LRocketForceY# + LiftRocketForceY#
ForceZ#=RearRocketForceZ + RRocketForceZ# + LRocketForceZ# + LiftRocketForceZ#
DeltaX# = ForceX+(DeltaX#*inertia)
DeltaY# = ForceY+(DeltaY#*inertia)
DeltaZ# = ForceZ+(DeltaZ#*inertia)
TranslateEntity Ship, DeltaX#, DeltaY#, DeltaZ#,1
If KeyHit(57) Then ;space bar resets coords to zero pos.
CurrentX# = ZeroX
CurrentY# = ZeroY
CurrentZ# = ZeroZ
PositionEntity Ship, CurrentX#, CurrentY#,CurrentZ#,1
RotateEntity Ship,0,0,0,1
DeltaX# = 0
DeltaY# = 0
DeltaZ# = 0
PositionEntity you,0,40,-150
PointEntity you,Ship
End If
If KeyHit(25) Then
follow = Not follow
If follow Then
EntityParent you,Ship
Else
EntityParent you,0
PositionEntity you,0,40,-150
End If
End If
If (DeltaX#<>0) Or (DeltaY#<>0) Or (DeltaZ#<>0) Then
AlignToVector ship,deltax,deltay,deltaz,3,TurnSpeed
End If
RenderWorld
Color 255,255,100
Text 10,10, " DeltaX "+DeltaX+" DeltaY "+ DeltaY+" DeltaZ "+ DeltaZ
Text 10,30, " Yaw Current "+ Floor(currentYaw) +" Dest "+Destyaw
; debuglog " Yaw Current " + floor(entityYaw(Ship,1)) +" Dest "+Destyaw
Text 10,50, " Pitch Current "+ Floor(EntityPitch(Ship,1))+" Dest "+destpitch
Color 100,55,255
text 0,530, " Arrow Keys to move using rockets. Ctrl + Left/Right Arrows = Turn ship with no rockets"
text 0,550, " Mousebutton 1 = forward - Mousebutton 2 = Lift Rocket - Mousebutton 3 = Down Rocket"
text 0,570, " Mousewheel = Speed. Space Bar = Return to Zero. P Key = Toggles Parenting Camera to ship"
Flip False
Wend
End
;This function is for drawing Grid Textures.
Function gridtex(s=512,st=5,width=2,colr=0,colg=0,colb=0,backcolr=0,backcolg=0,backcolb=0)
tex=CreateTexture(s,s,1)
SetBuffer TextureBuffer(tex)
Color backcolr,backcolg,backcolb
Rect 0,0,s,s,1
a = 0
i#=s/255.0
Repeat
If (colr+colg+colb = 0) Then
Color a Mod 255,Abs(255-a/i), 255-a;190+Sin(a)*50
DebugLog a
Else
Color colr,colg,colb
End If
For w= 0 To width-1
Line a+w,0,a+w,s
Line 0,a+w,s,a+w
Next
a = a + st
Until a => s
SetBuffer BackBuffer()
Return tex
End Function