Code archives/3D Graphics - Misc/Track AI function

This code has been declared by its author to be Public Domain code.

Download source code

Track AI function by BitmaniaK
(Posted 24 years ago)
Track functions...if anyone search for them
;TRACK_SMOOTH TRACK_YR TRACK_SMOOTH_YR SAMPLE DEMO
;WRITTEN By Bitmaniak
;Tracking Functions idea and specs By DoctorZ
;Tracking Functions code by Bitmaniak
;*********************************************************************************
;*** Thi is a real shared pivot...
;*********************************************************************************
Global gPivot1,gPivot2,gCube

;*********************************************************************************
;*** Slow PointEntity on xz axe
;*********************************************************************************
Function  track_YR_Smooth(e1,e2,smothness#=1.0)
	PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
	PointEntity gPivot1,e2	
	RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0
End Function

;*********************************************************************************
;*** Fast PointEntity on xz axe
;*********************************************************************************
Function  track_YR(e1,e2)
	PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
	PointEntity gPivot1,e2	
	RotateEntity e1, 0,EntityYaw(gPivot1),0
End Function

;*********************************************************************************
;*** Slow PointEntity on all axes
;*********************************************************************************
Function  track_Smooth(e1,e2,smothness#)
	PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
	PointEntity gPivot1,e2	
	RotateEntity e1, curveAngle#(EntityPitch(gPivot1),EntityPitch(e1),smothness#),curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0
End Function
;*********************************************************************************
;*** Fast PointEntity on all axes...so...pointEntity...just for fun!
;*********************************************************************************
Function  track(e1,e2)
	PointEntity e1,e2
End Function

;*********************************************************************************
;*** This calculate the 2d distance*distance on y axes 
;*** The exact distance is the sqr( EntityDistance_YR_Power2(e1,e2))
;*********************************************************************************
Function EntityDistance_YR_Power2(e1,e2)
	p#=EntityX(e2)-EntityX(e1)
	q#=EntityZ(e2)-EntityZ(e1)
	Return (p*p)+(q*q)
End Function

;*********************************************************************************
;*** Anyone knows this! Calculate the incremental steps
;*********************************************************************************
Function curveangle#( newangle#,oldangle#,increments#)
	If increments>1
		If (oldangle+360)-newangle<newangle-oldangle 
			oldangle=360+oldangle
		End If
		If (newangle+360)-oldangle<oldangle-newangle 
			newangle=360+newangle
		End If
		oldangle=oldangle-(oldangle-newangle)/increments
	End If
	If increments<=1 
		Return newangle
	End If
	Return oldangle

End Function

;*********************************************************************************
;*** Same of above but with points
;*********************************************************************************
;Global gPivot2
Function track_SmoothPoint(entity, x#,y#,z#, turnspeed#=1.0, useRoll%=0)
	PositionEntity gPivot2,x,y,z
	PositionEntity gPivot1,EntityX(entity),EntityY(entity),EntityZ(entity)
	PointEntity gPivot1,gPivot2	
	temp_pitch# = curveAngle#(EntityPitch(gPivot1),EntityPitch(entity),turnspeed#*2)
	temp_yaw# = curveAngle#(EntityYaw(gPivot1),EntityYaw(entity),turnspeed#)
	If useRoll
		temp_roll# = curveAngle#(EntityRoll(gPivot1),EntityRoll(entity),turnspeed#)
		RotateEntity entity, temp_pitch, temp_yaw, temp_roll
	Else
		RotateEntity entity, temp_pitch, temp_yaw, 0
	End If
End Function

;*********************************************************************************
;*** Create a squared texure
;*********************************************************************************
Function defaultTextureEntity(mesh, colr1=32,colg1=128,colb1=192, colr2=255,colg2=255,colb2=160)
	tex=CreateTexture( 64,64 )
	ScaleTexture tex,.125,.125
	SetBuffer TextureBuffer( tex )
	Color colr1,colg1,colb1:Rect 32,0,32,32:Rect 0,32,32,32
	Color colr2,colg2,colb2:Rect 0,0,32,32:Rect 32,32,32,32
	SetBuffer BackBuffer()
	Color 255,255,255

	brush=CreateBrush()
	BrushTexture brush,tex
	EntityTexture mesh,tex
	
	FreeBrush brush
	FreeTexture tex
End Function

;*********************************************************************************
;*** Draws Lines
;*********************************************************************************
Function drawpivot(e,camera,length)
	;Get initial position
	CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
	x=ProjectedX()
	y=ProjectedY()
	
	;Draw X axis
	Color 255,0,0
	MoveEntity e,length,0,0
	CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
	Line x,y,ProjectedX(),ProjectedY()
	MoveEntity e,-length,0,0
	
	;Draw Y axis
	Color 0,255,0
	MoveEntity e,0,length,0
	CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
	Line x,y,ProjectedX(),ProjectedY()
	MoveEntity e,0,-length,0
	
	;Draw Z axis
	Color 0,0,255
	MoveEntity e,0,0,length
	CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
	Line x,y,ProjectedX(),ProjectedY()
	MoveEntity e,0,0,-length
End Function


;*********************************************************************************
;*** The test!
;*********************************************************************************

Graphics3D 800,600
SetBuffer BackBuffer()

camera=CreateCamera()
light=CreateLight()

PositionEntity camera,0,0,-10

;*** create some entities
cone=CreateCone()
PositionEntity cone,-2,0,-5
RotateMesh cone,90,0,0
defaultTextureEntity(cone)


cone1=CopyEntity(cone)
PositionEntity cone1,-1,0,0
EntityColor cone1,255,0,0

cone2=CopyEntity(cone)
PositionEntity cone2,1,2,0
EntityColor cone2,0,255,0

cone3=CopyEntity(cone)
PositionEntity cone3,0,0,0
EntityColor cone3,0,255,255

cone4=CopyEntity(cone)
PositionEntity cone4,0,0,0
EntityColor cone4,255,255,0

cube=CreateCube()
PositionEntity cube,0,0,8
defaultTextureEntity(cube)


plane = CreatePlane()
defaultTextureEntity(plane)
PositionEntity plane,0,-.5,0
EntityAlpha plane,.5

gPivot1 = CreatePivot()
gPivot2 = CreatePivot()
gCube = CreatePivot()

gfxMiddleWidth = GraphicsWidth()/2
gfxMiddleHeight = GraphicsHeight()/2

;*********************************************************************************

While Not KeyDown( 1 )
;*** Cube rotation
	my = -MouseYSpeed()/5
	mx = MouseXSpeed()/5
	
	MoveMouse gfxMiddleWidth,gfxMiddleHeight
;	PositionEntity gPivot1,EntityX(cone),EntityY(cone),EntityZ(cone)
	PositionEntity gPivot1,0,0,0

	
    EntityParent cube,gCube
    TurnEntity gCube,my,mx,0
    EntityParent cube,0
	
;*** The routines
;*** Before you used to call a pointEntity(e1,e2)...now you'll call a track_Smooth(e1,e2,smooth)

	track_Smooth(cone,cube,20.0)
	track_Smooth(cone1,cube,100.0)	
	track(cone2,cube)	

	d#=EntityDistance_YR_Power2(cone3,cube)
	If d>1
		track_YR_Smooth(cone3,cube,10.0)	
		MoveEntity cone3,0,0,.1
	End If

	track_Smooth(cone4,cube,EntityDistance(cone4,cube)*2)	
	MoveEntity cone4,0,0,EntityDistance(cone4,cube)/200.0
	
	RenderWorld
	
	drawpivot(cone,camera,1)
	drawpivot(cone1,camera,1)
	drawpivot(cone2,camera,1)
	drawpivot(cone3,camera,1)
	drawpivot(cone4,camera,1)

	Text 0,0,d
	Flip
Wend

End