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 
 |