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.... compare
SuperStrict
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
|