Collision Avoidance Demo?

Blitz3D Forums/Blitz3D Programming/Collision Avoidance Demo?

I recall seeing a B3D demo that featured collision avoidence, where entities went around each other to avoid collisions, while turning to face (at a set rate, I believe) and moving towards a target. I think this is exactly what I need (entities that turn at a set rate, and avoid collisions) for my engine, but alas I cannot seem to track down this demo. Does anyone here know where I can get it?

Is this the chap?

;==========================
;Collision Avodance Demo v2
;By Andrew Pye AKA(3D)
;Date: 25/06/2004
;==========================
;=======================================================================
;Well at last I have come up with something that is
;simple and works well.
;The system works by using line pick with a large radius.
;If line pick picks up an entity then based on is pos it make a 
;decision  which way to turn and for how long.
;If there is no entity then head towards the target.
;But you will have to take a look through the code for all the details.
;
;Feel free to use the code in your own projects 
;But if you do just give us a little mention.
;=======================================================================


;=================
;set up enviroment
;=================
Graphics3D 640, 480,32,0
;Graphics3D 800, 600,32,0
light = CreateLight()


;=======
;globals
;=======
;======================
;Play with these values 
;======================
Global BotCount=30;number of bots
Global ObjticlesCount=50;number of obsticles
Global MAxSpeed#=0.5;speed of bots
Global TurnSpeedObsticles#=4;how fast to turn towards obsticles
Global TurnSpeedTarget#=2;how fast to turn towards target
Global SensterWidth#=1.5;how wide to check for collisions

;=====
;Types
;=====
Type Bot
	Field MainPiv,CActionCancelCount,CAction,model,CAnimationTime#
	Field SenPiv,cspeed#,CActionCount#
End Type

;======================
;create our target node
;======================
Global Target=CreateSphere()
EntityColor Target,255,0,0

;===============
;Create the bots
;===============
For i=0 To BotCount
	bots.bot=CreateBot()
Next

;store current view
Global CView

;============================================
;Create camera and attach to last created bot
;============================================
Global camera= CreateCamera(bots\MainPiv)
PositionEntity camera,0,10,-10;raise a little

;================
;create obsticals
;================
For i=0 To ObjticlesCount
	CreateObsticles()
Next

;==========
;set up fps
;==========
Const FPS=30
period=1000/FPS
time=MilliSecs()-period

;=========
;main loop
;=========
Repeat
			
	;=======================
	;time the frames per sec
	;=======================
	Repeat
		elapsed=MilliSecs()-time
	Until elapsed
	;how many 'frames' have elapsed	
	ticks=elapsed/period
	;fractional remainder
	tween#=Float(elapsed Mod period)/Float(period)
	If KeyHit(16) Then PositionEntity Target,Rnd(-150,150),0,Rnd(-150,150)
	If KeyHit(17) Then 
		If CView=0 Then
			PositionEntity camera,0,30,0
			RotateEntity camera,90,0,0
			CView=1
		ElseIf CView=1 Then
			PositionEntity camera,0,60,0
			RotateEntity camera,90,0,0
			CView=2
		ElseIf CView=2 Then
			PositionEntity camera,0,10,-10
			RotateEntity camera,0,0,0
			CView=0
		End If
	End If

	
	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld
		;===============
		;Ai for each bot
		;===============
		For b.bot = Each bot :BotAi b :Next
	Next
	
	UpdateWorld
	RenderWorld tween
	
	Text 1,1,"Collision Avoidance Demo V2"
	Text 1,15,"BY Andrew Pye"
	Text 1,30,"25/06/2004"
	Text 1,45,"Press (Q) to chage the Target"
	Text 1,60,"Press (W) to chage the View"
	Flip
	
Until KeyHit(1)
End

;======
;bot ai
;======
Function BotAi(b.bot)
	
	;================================
	;test to see if anything in front
	;================================
	result#=TestSensor(b);test sensor
	
	;=====================================
	;Check if to reset the action count
	;=====================================
	If result#=0 And b\CActionCount#>0 Then 
		b\CActionCancelCount#=b\CActionCancelCount#-1;reduce the action count
		If b\CActionCancelCount#<-8 Then
			b\CActionCount#=0
		End If
	Else
		b\CActionCancelCount#=0
	End If
	
	If b\CActionCount#>0 Then;see if we are performing an action
		If b\CAction=0 Then;turn left
			TurnEntity b\MainPiv,0,-TurnSpeedObsticles#,0
		ElseIf b\CAction=1 Then;turn rigth
			TurnEntity b\MainPiv,0,TurnSpeedObsticles#,0
		End If
		
		;=========================
		;decrease the action count
		;=========================
		b\CActionCount#=b\CActionCount#-1
		If b\CActionCount#<0 Then 
			b\CActionCount#=0
		End If
	Else
		;======================
		;see if we hit anything
		;======================
		If result#<>0 Then
			;=========================
			;find out what way to turn
			;=========================
			If DeltaYaw#(b\MainPiv,result#)>0 Then 
				b\cspeed#=0;stop
				b\CAction=0;turn left
				b\CActionCount#=Abs(Int(DeltaYaw#(b\MainPiv,result#)))*1.5;how long to turn
				If b\CActionCount#=<0.1 Then b\CActionCount#=45	;make sure it does turn	
			ElseIf DeltaYaw#(b\MainPiv,result#)<0 Then
				b\cspeed#=0;stop
				b\CAction=1;turn rigth
				b\CActionCount#=Abs(Int(DeltaYaw#(b\MainPiv,result#)))*1.5;how long to turn
				If b\CActionCount#=<0.1 Then b\CActionCount#=45		;make sure it does turn	
			EndIf
			
			b\CActionCancelCount#=0;reset the action cancel
			AnimateBot b;animate the bot
		Else
			;==============================
			;no collision so move to target
			;==============================
			If DeltaYaw#(b\MainPiv,target)>4 Then;0 Then
				TurnEntity b\MainPiv,0,TurnSpeedTarget#,0
			ElseIf DeltaYaw#(b\MainPiv,target)<-4 Then;0 Then
				TurnEntity b\MainPiv,0,-TurnSpeedTarget#,0
			EndIf
			b\CAction=3;action is goto the target
			AnimateBot b		;animate bot
			b\cspeed#=b\cspeed#+0.1 : If b\cspeed#>MAxSpeed# Then b\cspeed#=MAxSpeed#;increase speed
		End If
	End If

	MoveEntity b\MainPiv,0,0,b\cspeed#

End Function

;===============
;animate the bot
;===============
Function AnimateBot(b.bot)
	b\CAnimationTime#=b\CAnimationTime#+MAxSpeed#*2.6
	If b\CAnimationTime#>30 Then b\CAnimationTime#=0
	SetAnimTime b\model,b\CAnimationTime#
End Function

;=========================
;function Create Obsticals
;=========================
Function CreateObsticles()
	b=LoadMesh( "oil-drum\oildrum.3ds")
	ScaleEntity b,0.1,0.1,0.1
	EntityPickMode b,1;set the entity pick
	PositionEntity b,Rnd(-100,100),0,Rnd(-100,100);random pos
	Return b
End Function

;===================
;function create bot
;===================
Function CreateBot.bot()
	b.bot=New bot
	
	b\MainPiv=CreatePivot();create the bot model
	;load the model and setup
	b\model=LoadAnimMesh( "bot\robot2.b3d",b\MainPiv)
	RotateEntity b\model,0,90,0
	PositionEntity b\model,0,-1,0
	ScaleEntity b\model,2,2,2
	;set up animation
	ExtractAnimSeq b\model,0,30
	ExtractAnimSeq b\model,31,100
	ExtractAnimSeq b\model,107,107
	Animate b\model,1,0.5,1,10
	;set up sensor pivot
	b\SenPiv=CreatePivot(b\MainPiv);add the sensor pivot
	PositionEntity b\SenPiv,0,0,2;position the sensor
	PositionEntity b\MainPiv,Rnd(-30,30),0,Rnd(-50,50);random pos
	EntityPickMode b\MainPiv,1;set the entity pick
	Return b
End Function


;==================
;test for collision
;==================
Function TestSensor(b.bot)
	;see if touching anything
	SenObjId=LinePick( EntityX(b\MainPiv), EntityY(b\MainPiv),EntityZ(b\MainPiv),EntityX(b\SenPiv,True)-EntityX(b\MainPiv), EntityY(b\SenPiv,True)-EntityY(b\MainPiv),EntityZ(b\SenPiv,True)-EntityZ(b\MainPiv), SensterWidth#)  
	Return SenObjId
End Function


That's it!

Thanks a lot!