TFormPoint Angle?
BlitzMax Forums/MiniB3D Module/TFormPoint Angle?
| ||
I have a entity and I want to know how many degrees I would need to turn it in order for it to face its target, is there a way to do this without toying with more trigonometry... ? |
| ||
nvm! got it, this may be a handy little tool .... included some extra stuff to test times... SuperStrict Import sidesign.minib3d Graphics3D(800,600,0,2,60) Local time:Int = 100 Local t_load1:Int = MilliSecs() Local ball:Tmesh = CreateCube() 'LoadMesh("ball.b3d") Local t_load2:Int = MilliSecs() Local t_load:Int = t_load2 - t_load1 Local ball2:TMesh = CreateCube() PositionEntity(ball2,-20,20,20) Local t_turn1:Int=MilliSecs() For Local x:Int = 1 To time TurnEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_turn2:Int=MilliSecs() Local t_turn:Int = t_turn2 - t_turn1 Local t_rotate1:Int = MilliSecs() For Local x:Int = 1 To time RotateEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_rotate2:Int = MilliSecs() Local t_rotate:Int = t_rotate2 - t_rotate1 Local t_point1:Int = MilliSecs() For Local x:Int = 1 To time PointEntity(ball,ball2) Next Local t_point2:Int = MilliSecs() Local t_point:Int = t_point2 - t_point1 Local t_formx1:Int = MilliSecs() For Local x:Int = 1 To time Local a:Int = TFormedX() Next Local t_formx2:Int = MilliSecs() Local t_formx:Int = t_formx2 - t_formx1 Local t_position1:Int = MilliSecs() For Local x:Int = 1 To time PositionEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_position2:Int = MilliSecs() Local t_position:Int = t_position2 - t_position1 Local t_move1:Int = MilliSecs() For Local x:Int = 1 To time MoveEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_move2:Int = MilliSecs() Local t_move:Int = t_move2 - t_move1 Local t_form1:Int = MilliSecs() For Local x:Int = 1 To time TFormPoint(0,0,0,ball,ball2) TFormedX() TFormedY() TFormedZ() Next Local t_form2:Int = MilliSecs() Local t_form:Int = t_form2 - t_form1 Local t_formq1:Int = MilliSecs() For Local x:Int = 1 To time TFormAngle.Point(ball,ball2) TFormAngle.Pitch() TFormAngle.Yaw() 'TQuickForm.Roll() Next Local t_formq2:Int = MilliSecs() Local t_formq:Int = t_formq2 - t_formq1 Local t_loop1:Int = MilliSecs() For Local x:Int = 1 To time Next Local t_loop2:Int = MilliSecs() Local t_loop:Int = t_loop2 - t_loop1 Local entx:Float Local t_entityx1:Int = MilliSecs() For Local x:Int = 1 To time entx = EntityX(ball) Next Local t_entityx2:Int = MilliSecs() Local t_entityx:Int = t_entityx2 - t_entityx1 Local t_entityxg1:Int = MilliSecs() For Local x:Int = 1 To time entx = EntityX(ball,True) Next Local t_entityxg2:Int = MilliSecs() Local t_entityxg:Int = t_entityxg2 - t_entityxg1 Local variable:Int Local t_var1:Int = MilliSecs() For Local x:Int = 1 To time variable = ((4 + 43)/123)*12 Next Local t_var2:Int = MilliSecs() Local t_var:Int = t_var2 - t_var1 Local camera:TCamera=CreateCamera() PositionEntity(Camera,0,0,-10) Local light:TLight=CreateLight() PositionEntity(light,0,10,-10) PositionEntity(ball,0,0,0) RotateEntity(ball,0,0,0) PositionEntity(ball2,0,0,10) Local tx:Float Local ty:Float Local tz:Float Local tx2:Float Local ty2:Float Local tz2:Float While Not KeyHit(KEY_ESCAPE) TFormPoint(0,0,0,ball2,ball) tx = TFormedX() ty = TFormedY() tz = TFormedZ() TFormAngle.Point(ball2,ball) tx2 = TFormAngle.X() ty2 = TFormAngle.Y() tz2 = TFormAngle.Z() If KeyDown(KEY_DOWN) Then MoveEntity(ball,0,-0.1,0) If KeyDown(KEY_UP) Then MoveEntity(ball,0,0.1,0) If KeyDown(KEY_LEFT) Then MoveEntity(ball,-0.1,0,0) If KeyDown(KEY_RIGHT) Then MoveEntity(ball,0.1,0,0) If KeyDown(KEY_NUMADD) Then MoveEntity(ball,0,0,0.1) If KeyDown(KEY_NUMSUBTRACT) Then MoveEntity(ball,0,0,-0.1) If KeyDown(KEY_A) Then TurnEntity(ball,0,1,0) If KeyDown(KEY_D) Then TurnEntity(ball,0,-1,0) If KeyDown(KEY_W) Then TurnEntity(ball,1,0,0) If KeyDown(KEY_S) Then TurnEntity(ball,-1,0,0) If KeyDown(KEY_Z) Then TurnEntity(ball,0,0,1) If KeyDown(KEY_X) Then TurnEntity(ball,0,0,-1) If KeyHit(KEY_C) Then TurnEntity(ball,0,0.1,0) If KeyHit(KEY_V) Then TurnEntity(ball,0,-0.1,0) UpdateWorld RenderWorld BeginMax2D() DrawText "LoadTime: " + t_load,0,0 DrawText "TurnTime: " + t_turn,0,12 DrawText "RotateTime: " + t_rotate,0,24 DrawText "PointTime: " + t_point,0,36 DrawText "TFormTime: " + t_form,0,48 DrawText "TFormXCall: " + t_formx,0,60 DrawText "PositionTime: " + t_position,0,72 DrawText "MoveTime: " + t_move,0,84 DrawText "LoopTime: " + t_loop,0,96 DrawText "EntityXCall: " + t_entityx,0,108 DrawText "EntityXCallGlobal: " + t_entityxg,0,120 DrawText "VariableAssignment: " + t_var,0,132 DrawText "QTFormTime: " + t_formq,0,144 DrawText "TFormX: " + tx,GraphicsWidth()-200,0 DrawText "TFormY: " + ty,GraphicsWidth()-200,12 DrawText "TFormZ: " + tz,GraphicsWidth()-200,24 DrawText "QTFormX: " + tx2,GraphicsWidth()-200,48 DrawText "QTFormY: " + ty2,GraphicsWidth()-200,60 DrawText "QTFormZ: " + tz2,GraphicsWidth()-200,72 DrawText "Pitch: " + EntityPitch(ball,True),GraphicsWidth()-200,96 DrawText "Yaw: " + EntityYaw(ball,True),GraphicsWidth()-200,108 DrawText "Roll: " + EntityRoll(ball,True),GraphicsWidth()-200,120 DrawText "QTPitch: " + TFormAngle.Pitch(),GraphicsWidth()-200,134 DrawText "QTYaw: " + TFormAngle.Yaw(),GraphicsWidth()-200,146 DrawText "QTRoll: " + TFormAngle.Roll(),GraphicsWidth()-200,158 EndMax2D() Flip Cls Wend Type TFormAngle Global Source:TMesh Global Dest:TMesh Global tx:Float Global ty:Float Global tz:Float Global valp:Float Global valy:Float Global valr:Float Function Point(TargetEntity:TMesh,SourceEntity:TMesh) Source = TargetEntity Dest = SourceEntity tx = EntityX(Source ,True) - EntityX(Dest ,True) ty = EntityY(Source ,True) - EntityY(Dest ,True) tz = EntityZ(Source ,True) - EntityZ(Dest ,True) End Function Function Pitch:Float() If ty < 0 Return -((90 - ATan(tz/Abs(ty))) + EntityPitch(Dest,True)) EndIf Return (90 - ATan(tz/ty)) + EntityPitch(Dest,True) End Function Function Yaw:Float() Local val:Float = 0 If tx < 0 val = -(90 - ATan(tz/Abs(tx))) + EntityYaw(Dest,True) Else val = (90 - ATan(tz/tx)) + EntityYaw(Dest,True) EndIf If val > 180 Return (val - 360) ElseIf val < -180 Return (val + 360) Else Return val EndIf End Function Function Roll:Float() If tz < 0 Return -((90 - ATan(ty/Abs(tx))) + EntityRoll(Dest,True)) EndIf Return (90 - ATan(ty/tx)) + EntityRoll(Dest,True) End Function Function X:Float() Return tx End Function Function Y:Float() Return ty End Function Function Z:Float() Return tz End Function End Type |
| ||
Why not just use EntityYaw? Ooops - I mean DeltaYaw :P~ |
| ||
you could try parenting a pivot to the 'turner' then point the pivot at the target then the pivots entityyaw is the angle you need |
| ||
:( DeltaYaw does exactly what I coded above, so many times I've recoded already available Blitz functions... not funny |
| ||
and is twice as fast.... compareSuperStrict Import sidesign.minib3d Graphics3D(800,600,0,2,60) Local time:Int = 1000000 Local t_load1:Int = MilliSecs() Local ball:TMesh = CreateCube() 'LoadMesh("ball.b3d") Local t_load2:Int = MilliSecs() Local t_load:Int = t_load2 - t_load1 Local ball2:TMesh = CreateCube() PositionEntity(ball2,-20,20,20) Local t_turn1:Int=MilliSecs() For Local x:Int = 1 To time TurnEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_turn2:Int=MilliSecs() Local t_turn:Int = t_turn2 - t_turn1 Local t_rotate1:Int = MilliSecs() For Local x:Int = 1 To time RotateEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_rotate2:Int = MilliSecs() Local t_rotate:Int = t_rotate2 - t_rotate1 Local t_point1:Int = MilliSecs() For Local x:Int = 1 To time PointEntity(ball,ball2) Next Local t_point2:Int = MilliSecs() Local t_point:Int = t_point2 - t_point1 Local t_formx1:Int = MilliSecs() For Local x:Int = 1 To time Local a:Int = TFormedX() Next Local t_formx2:Int = MilliSecs() Local t_formx:Int = t_formx2 - t_formx1 Local t_position1:Int = MilliSecs() For Local x:Int = 1 To time PositionEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_position2:Int = MilliSecs() Local t_position:Int = t_position2 - t_position1 Local t_move1:Int = MilliSecs() For Local x:Int = 1 To time MoveEntity(ball,Rnd(0,180),Rnd(0,180),Rnd(0,180)) Next Local t_move2:Int = MilliSecs() Local t_move:Int = t_move2 - t_move1 Local t_form1:Int = MilliSecs() For Local x:Int = 1 To time TFormPoint(0,0,0,ball,ball2) TFormedX() TFormedY() TFormedZ() Next Local t_form2:Int = MilliSecs() Local t_form:Int = t_form2 - t_form1 Local t_formq1:Int = MilliSecs() For Local x:Int = 1 To time TFormAngle.Point(ball,ball2) 'TFormAngle.Pitch() TFormAngle.Yaw() 'TQuickForm.Roll() Next Local t_formq2:Int = MilliSecs() Local t_formq:Int = t_formq2 - t_formq1 Local t_delta1:Int = MilliSecs() For Local x:Int = 1 To time DeltaYaw(ball,ball2) Next Local t_delta2:Int = MilliSecs() Local t_delta:Int = t_delta2 - t_delta1 Local t_loop1:Int = MilliSecs() For Local x:Int = 1 To time Next Local t_loop2:Int = MilliSecs() Local t_loop:Int = t_loop2 - t_loop1 Local entx:Float Local t_entityx1:Int = MilliSecs() For Local x:Int = 1 To time entx = EntityX(ball) Next Local t_entityx2:Int = MilliSecs() Local t_entityx:Int = t_entityx2 - t_entityx1 Local t_entityxg1:Int = MilliSecs() For Local x:Int = 1 To time entx = EntityX(ball,True) Next Local t_entityxg2:Int = MilliSecs() Local t_entityxg:Int = t_entityxg2 - t_entityxg1 Local variable:Int Local t_var1:Int = MilliSecs() For Local x:Int = 1 To time variable = ((4 + 43)/123)*12 Next Local t_var2:Int = MilliSecs() Local t_var:Int = t_var2 - t_var1 Local camera:TCamera=CreateCamera() PositionEntity(Camera,0,0,-10) Local light:TLight=CreateLight() PositionEntity(light,0,10,-10) PositionEntity(ball,0,0,0) RotateEntity(ball,0,0,0) PositionEntity(ball2,0,0,10) Local tx:Float Local ty:Float Local tz:Float Local tx2:Float Local ty2:Float Local tz2:Float While Not KeyHit(KEY_ESCAPE) TFormPoint(0,0,0,ball2,ball) tx = TFormedX() ty = TFormedY() tz = TFormedZ() TFormAngle.Point(ball2,ball) tx2 = TFormAngle.X() ty2 = TFormAngle.Y() tz2 = TFormAngle.Z() If KeyDown(KEY_DOWN) Then MoveEntity(ball,0,-0.1,0) If KeyDown(KEY_UP) Then MoveEntity(ball,0,0.1,0) If KeyDown(KEY_LEFT) Then MoveEntity(ball,-0.1,0,0) If KeyDown(KEY_RIGHT) Then MoveEntity(ball,0.1,0,0) If KeyDown(KEY_NUMADD) Then MoveEntity(ball,0,0,0.1) If KeyDown(KEY_NUMSUBTRACT) Then MoveEntity(ball,0,0,-0.1) If KeyDown(KEY_A) Then TurnEntity(ball,0,1,0) If KeyDown(KEY_D) Then TurnEntity(ball,0,-1,0) If KeyDown(KEY_W) Then TurnEntity(ball,1,0,0) If KeyDown(KEY_S) Then TurnEntity(ball,-1,0,0) If KeyDown(KEY_Z) Then TurnEntity(ball,0,0,1) If KeyDown(KEY_X) Then TurnEntity(ball,0,0,-1) If KeyHit(KEY_C) Then TurnEntity(ball,0,0.1,0) If KeyHit(KEY_V) Then TurnEntity(ball,0,-0.1,0) UpdateWorld RenderWorld BeginMax2D() DrawText "LoadTime: " + t_load,0,0 DrawText "TurnTime: " + t_turn,0,12 DrawText "RotateTime: " + t_rotate,0,24 DrawText "PointTime: " + t_point,0,36 DrawText "TFormTime: " + t_form,0,48 DrawText "TFormXCall: " + t_formx,0,60 DrawText "PositionTime: " + t_position,0,72 DrawText "MoveTime: " + t_move,0,84 DrawText "LoopTime: " + t_loop,0,96 DrawText "EntityXCall: " + t_entityx,0,108 DrawText "EntityXCallGlobal: " + t_entityxg,0,120 DrawText "VariableAssignment: " + t_var,0,132 DrawText "QTFormTime: " + t_formq,0,144 DrawText "DeltaYawTime: " + t_delta,0,156 DrawText "TFormX: " + tx,GraphicsWidth()-200,0 DrawText "TFormY: " + ty,GraphicsWidth()-200,12 DrawText "TFormZ: " + tz,GraphicsWidth()-200,24 DrawText "QTFormX: " + tx2,GraphicsWidth()-200,48 DrawText "QTFormY: " + ty2,GraphicsWidth()-200,60 DrawText "QTFormZ: " + tz2,GraphicsWidth()-200,72 DrawText "Pitch: " + EntityPitch(ball,True),GraphicsWidth()-200,96 DrawText "Yaw: " + EntityYaw(ball,True),GraphicsWidth()-200,108 DrawText "Roll: " + EntityRoll(ball,True),GraphicsWidth()-200,120 DrawText "QTPitch: " + TFormAngle.Pitch(),GraphicsWidth()-200,134 DrawText "QTYaw: " + TFormAngle.Yaw(),GraphicsWidth()-200,146 DrawText "QTRoll: " + TFormAngle.Roll(),GraphicsWidth()-200,158 EndMax2D() Flip Cls Wend Type TFormAngle Global Source:TMesh Global Dest:TMesh Global tx:Float Global ty:Float Global tz:Float Global valp:Float Global valy:Float Global valr:Float Function Point(TargetEntity:TMesh,SourceEntity:TMesh) Source = TargetEntity Dest = SourceEntity tx = EntityX(Source ,True) - EntityX(Dest ,True) ty = EntityY(Source ,True) - EntityY(Dest ,True) tz = EntityZ(Source ,True) - EntityZ(Dest ,True) End Function Function Pitch:Float() If ty < 0 Return -((90 - ATan(tz/Abs(ty))) + EntityPitch(Dest,True)) EndIf Return (90 - ATan(tz/ty)) + EntityPitch(Dest,True) End Function Function Yaw:Float() Local val:Float = 0 If tx < 0 val = -(90 - ATan(tz/Abs(tx))) + EntityYaw(Dest,True) Else val = (90 - ATan(tz/tx)) + EntityYaw(Dest,True) EndIf If val > 180 Return (val - 360) ElseIf val < -180 Return (val + 360) Else Return val EndIf End Function Function Roll:Float() If tz < 0 Return -((90 - ATan(ty/Abs(tx))) + EntityRoll(Dest,True)) EndIf Return (90 - ATan(ty/tx)) + EntityRoll(Dest,True) End Function Function X:Float() Return tx End Function Function Y:Float() Return ty End Function Function Z:Float() Return tz End Function End Type |