TFormPoint Angle?

BlitzMax Forums/MiniB3D Module/TFormPoint Angle?

BLaBZ(Posted 2010) [#1]
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... ?


BLaBZ(Posted 2010) [#2]
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 




SLotman(Posted 2010) [#3]
Why not just use EntityYaw?

Ooops - I mean DeltaYaw :P~


slenkar(Posted 2010) [#4]
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


BLaBZ(Posted 2010) [#5]
:( DeltaYaw does exactly what I coded above, so many times I've recoded already available Blitz functions... not funny


BLaBZ(Posted 2010) [#6]
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