Code archives/3D Graphics - Misc/3D Pathfinding Lib
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Does what it says on the tin You can download it from here www.mrpye.com/Blitz | |||||
Webpage www.mrpye.com/Blitz/Pathfinding/pathfinding.htm Download www.mrpye.com/Blitz/Pathfinding/3DPathFinding1.zip |
Comments
| ||
OLD, 404. |
| ||
There was a problem with the webserver all working again |
| ||
I'm worried that one day the links will be gone forever. The page is still there: http://www.mrpye.com/Blitz/ I've edited the Collision Avoidance demo to use Blitz primitives - so it can run as is. I've renamed the obstacle as 'barrel' rather than 'b' as this might be confusing for a novice - considering the use of the Type 'b\' for the bot. I've remarked out the animation and changed the height of the bot. http://www.blitzbasic.co.nz/logs/userlog.php?user=1673&log=1185 ;========================== ;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,16,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,3.6,0;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,3.6,0 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() barrel=CreateCylinder() EntityColor barrel,100,100,100 ; line added ; ScaleEntity barrel,0.1,0.1,0.1 EntityPickMode barrel,1;set the entity pick PositionEntity barrel,Rnd(-100,100),0,Rnd(-100,100);random pos Return barrel 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=CreateCube(b\MainPiv) EntityColor b\model,0,0,255 ; line added RotateEntity b\model,0,90,0 PositionEntity b\model,0,0,0; he had the height set to -1 ScaleEntity b\model,1,2,1 ;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 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 |
| ||
mrpye. i know it been a really long time but i am in the process of bringing blitz3d BACK FROM THE DEAD! :P my current game is in need of pathfinding such as the one you have created years ago... i was wondering if you could find it in the good of your heart to contact me and assist me for i am having trouble modifying the code to suit my needs... ^i intend to give you full credit by the way, |
Code Archives Forum