boids (xmas, a tiny xmas present)


#1

hi, like as a xmas present, im going to share a piece of code which i had done yesterday. due the fact im faszinated by swarm formations, i got motivated to write on an nice fish and birds one.

its written in python and based onto the panda3d engine. (the download link -> http://www.panda3d.org/download/panda3d-1.7.0/Panda3D-1.7.0.exe )

here a very early version of it. (maybe someone like it, like i do)

cheers and merry messedmas with tree
dirk hochegger

sorry the code got messed up by pasting it in here, you need to reconstruct by hand the python code hierachy.

EDIT:
if you have reconstruct the code right, you will reach a error message while executing, it will point that your model (plane) is missing. use the plane which is used in the sample files (asteroids).
[left]

 #boid system v. 0.1 SHARK ATTACK [/left]

[left]#dirk hochegger 2010[/left]

[left]#[/left]

[left][/left]

[left]import direct.directbase.DirectStart[/left]

[left]from direct.showbase.DirectObject import DirectObject[/left]

[left]from panda3d.core import GraphicsOutput[/left]

[left]from panda3d.core import Filename,Texture[/left]

[left]from direct.task.Task import Task[/left]

[left]from panda3d.core import Vec4, Vec3, NodePath,RigidBodyCombiner[/left]

[left]from direct.filter.CommonFilters import CommonFilters[/left]

[left]import math,random[/left]

[left][/left]

[left]rbc = RigidBodyCombiner("rbc")[/left]

[left]rbcnp = NodePath(rbc)[/left]

[left][/left]

[left]class shark:[/left]

[left]def __init__(self):[/left]

[left]self.velo = {}[/left]

[left]x = 0.0[/left]

[left]y = 0.0[/left]

[left]z = 0.0[/left]

[left]sx = random.uniform(4.0,-4)[/left]

[left]sy = 10[/left]

[left]sz = random.uniform(4.0,-4)[/left]

[left]renderTYPE = None[/left]

[left]self.shark = NodePath()[/left]

[left]def paint (self):[/left]

[left]self.shark = loader.loadModel("plane")[/left]

[left]self.shark.setTag("Blur Shading", "True")[/left]

[left][/left]

[left]def renderTO(self,renderTYPE):[/left]

[left]rbcnp.reparentTo(render)[/left]

[left]self.shark.reparentTo(renderTYPE) [/left]

[left]rbc.collect()[/left]

[left]def setPOS(self,x,y,z):[/left]

[left]self.shark.setPos(x,y,z)[/left]

[left]def getPOS(self):[/left]

[left]return self.shark.getPos()[/left]

[left]def getX(self):[/left]

[left]return self.shark.getX()[/left]

[left]def getY(self):[/left]

[left]return self.shark.getZ()[/left]

[left]def setSCALE(self,sx,sy,sz):[/left]

[left]self.shark.setScale(sx,sy,sz)[/left]

[left]def setCOLOR(self,color):[/left]

[left]self.shark.setColor(color)[/left]

[left]def getCOLOR(self):[/left]

[left]return self.shark.getColor()[/left]

[left][/left]

[left]class boid:[/left]

[left]def __init__(self):[/left]

[left]self.velo = {}[/left]

[left]x = 0.0[/left]

[left]y = 0.0[/left]

[left]z = 0.0[/left]

[left]sx = random.uniform(4.0,-4)[/left]

[left]sy = 10[/left]

[left]sz = random.uniform(4.0,-4)[/left]

[left]renderTYPE = None[/left]

[left][/left]

[left]self.boid = NodePath()[/left]

[left]def paint (self):[/left]

[left]self.boid = loader.loadModel("plane")[/left]

[left]self.boid.setTag("Blur Shading", "True")[/left]

[left]def renderTO(self,renderTYPE):[/left]

[left]rbcnp.reparentTo(render)[/left]

[left]self.boid.reparentTo(renderTYPE) [/left]

[left]rbc.collect()[/left]

[left]def setPOS(self,x,y,z):[/left]

[left]self.boid.setPos(x,y,z)[/left]

[left]def getPOS(self):[/left]

[left]return self.boid.getPos()[/left]

[left]def getX(self):[/left]

[left]return self.boid.getX()[/left]

[left]def getY(self):[/left]

[left]return self.boid.getZ()[/left]

[left]def setSCALE(self,sx,sy,sz):[/left]

[left]self.boid.setScale(sx,sy,sz)[/left]

[left]def remove (self):[/left]

[left]self.boid.removeNode()[/left]

[left]def setCOLOR(self,color):[/left]

[left]self.boid.setColor(color)[/left]

[left][/left]

[left][/left]

[left]class magnet:[/left]

[left]def __init__(self):[/left]

[left]self.velo = {}[/left]

[left]x = 0.0[/left]

[left]y = 0.0[/left]

[left]z = 0.0[/left]

[left]color=Vec4(0,0,0,0)[/left]

[left]sx = random.uniform(4.0,-4)[/left]

[left]sy = 10[/left]

[left]sz = random.uniform(4.0,-4)[/left]

[left]renderTYPE = None[/left]

[left][/left]

[left]self.mag = NodePath()[/left]

[left]def paint (self):[/left]

[left]self.mag = loader.loadModel("plane")[/left]

[left]self.mag.setTag("Blur Shading", "True")[/left]

[left]def renderTO(self,renderTYPE):[/left]

[left]rbcnp.reparentTo(render)[/left]

[left]self.mag.reparentTo(renderTYPE) [/left]

[left]rbc.collect()[/left]

[left]def setPOS(self,x,y,z):[/left]

[left]self.mag.setPos(x,y,z)[/left]

[left]def getPOS(self):[/left]

[left]return self.mag.getPos()[/left]

[left]def getX(self):[/left]

[left]return self.mag.getX()[/left]

[left]def getY(self):[/left]

[left]return self.mag.getZ()[/left]

[left]def setSCALE(self,sx,sy,sz):[/left]

[left]self.mag.setScale(sx,sy,sz)[/left]

[left]def setCOLOR(self,color):[/left]

[left]self.mag.setColor(color)[/left]

[left][/left]

[left]class main(DirectObject):[/left]

[left]def __init__(self):[/left]

[left]base.disableMouse()[/left]

[left]base.setBackgroundColor(0,0,0,1) [/left]

[left]self.tex = Texture()[/left]

[left]self.tex.setMinfilter(Texture.FTLinear)[/left]

[left]base.win.addRenderTexture(self.tex, GraphicsOutput.RTMTriggeredCopyTexture)[/left]

[left]base.camera.setY(-15)[/left]

[left][/left]

[left]self.backcam = base.makeCamera2d(base.win, sort=-10)[/left]

[left]self.background = NodePath("background")[/left]

[left]self.backcam.reparentTo(self.background)[/left]

[left][/left]

[left]self.background.setDepthTest(0)[/left]

[left]self.background.setDepthWrite(0)[/left]

[left]self.backcam.node().getDisplayRegion(0).setClearDepthActive(0)[/left]

[left][/left]

[left]self.backCARD = base.win.getTextureCard()[/left]

[left]self.backCARD.reparentTo(self.background)[/left]

[left]self.backCARD.setTransparency(1)[/left]

[left][/left]

[left]self.frontCARD = base.win.getTextureCard()[/left]

[left]self.frontCARD.reparentTo(render2d)[/left]

[left]self.frontCARD.setTransparency(1)[/left]

[left][/left]

[left]self.motionTRAIL() [/left]

[left]taskMgr.add(self.snapSHOT, "snapSHOT")[/left]

[left]self.clickrate = 2000[/left]

[left][/left]

[left]if (base.win.getGsg().getCopyTextureInverted()):[/left]

[left]self.backCARD.setScale(1,1,-1)[/left]

[left]self.frontCARD.setScale(1,1,-1)[/left]

[left][/left]

[left]self.boids={}[/left]

[left]self.mag={}[/left]

[left]self.shark = {}[/left]

[left]self.massMAG={}[/left]

[left]self.mass = {}[/left]

[left]self.veloX = {}[/left]

[left]self.veloY = {}[/left]

[left]self.veloX_shark = {}[/left]

[left]self.veloY_shark = {}[/left]

[left]self.freq = 0.0[/left]

[left]self.time = 0.0[/left]

[left]self.boidCOUNT = 0[/left]

[left]# self.color1 = Vec4(1.0,1.0,1.0,.98)[/left]

[left][/left]

[left]for i in xrange(50):[/left]

[left]self.create(i)[/left]

[left]for i in xrange(4):[/left]

[left]self.createMAG(i)[/left]

[left]for i in xrange(4):[/left]

[left]self.createSHARK(i)[/left]

[left][/left]

[left]taskMgr.add(self.mainLOOP, "ml")[/left]

[left][/left]

[left]def snapSHOT(self, task):[/left]

[left]if (task.time > self.nextclick):[/left]

[left]self.nextclick += 1 / self.clickrate[/left]

[left]if (self.nextclick < task.time):[/left]

[left]self.nextclick = task.time[/left]

[left]base.win.triggerCopy()[/left]

[left]return Task.cont[/left]

[left][/left]

[left]def motionTRAIL(self):[/left]

[left]self.backCARD.show()[/left]

[left]self.frontCARD.setColor(1,1,1,.98)[/left]

[left]self.frontCARD.setPos(-.001,0,.001)[/left]

[left]self.nextclick = 0[/left]

[left][/left]

[left]def createSHARK(self,i):[/left]

[left]self.veloX_shark[i] = .1[/left]

[left]self.veloY_shark[i] = .1[/left]

[left]self.shark[i] = shark()[/left]

[left]self.shark[i].paint()[/left]

[left]self.shark[i].renderTO(render)[/left]

[left]self.shark[i].setPOS(random.uniform(10.0,-10),10,random.uniform(10.0,-10))[/left]

[left]self.shark[i].setSCALE(.14,.1,.14)[/left]

[left]self.shark[i].setCOLOR(Vec4(random.uniform(0.4,1.0),0,0,random.uniform(0.0,1.0)))[/left]

[left][/left]

[left]def createMAG(self,i): [/left]

[left]self.mag[i] = magnet()[/left]

[left]self.massMAG[i] = random.uniform(.1,1)[/left]

[left]self.mag[i].paint()[/left]

[left]self.mag[i].setPOS(random.uniform(6.0,-6),10,random.uniform(6.0,-6))[/left]

[left]# self.mag[i].renderTO(render)[/left]

[left]self.mag[i].setCOLOR(Vec4(self.massMAG[i],0,0,random.uniform(0.0,1.0)))[/left]

[left][/left]

[left]def create(self,i): [/left]

[left]self.mass[i] = random.uniform(.2,1)[/left]

[left]self.veloX[i] = .1[/left]

[left]self.veloY[i] = .1[/left]

[left]self.boids[i]=boid()[/left]

[left]self.boids[i].paint()[/left]

[left]self.boids[i].setSCALE(.1,.08,.1)[/left]

[left]self.boids[i].setPOS(random.uniform(1.0,-1),10,random.uniform(1.0,-1))[/left]

[left]self.boids[i].renderTO(rbcnp)[/left]

[left]self.boids[i].setCOLOR(Vec4(0,random.uniform(0.1,.9),random.uniform(0.0,.15),random.uniform(1,1.0)))[/left]

[left][/left]

[left]def attack(self,i):[/left]

[left]attack =0[/left]

[left]for ii in xrange(len(self.shark)):[/left]

[left]if (i!=ii):[/left]

[left]dis = self.boids[i].getPOS()-self.shark[ii].getPOS()[/left]

[left]dis = dis.length()[/left]

[left]base = self.boids[i].getX()-self.shark[ii].getX()[/left]

[left]heigh = self.boids[i].getY()-self.shark[ii].getY()[/left]

[left]if (dis > 5):[/left]

[left]attack = 1[/left]

[left]self.setVELO_shark(ii,base,heigh,dis,self.time,attack)[/left]

[left][/left]

[left]def move(self):[/left]

[left]self.freq+=.1[/left]

[left]self.boidCOUNT = len(self.boids)[/left]

[left]for i in xrange(self.boidCOUNT):[/left]

[left]self.attack(i)[/left]

[left]#get velo neighbour[/left]

[left]posBOID_pos = self.boids[i].getPOS()[/left]

[left]posBOID_x = self.boids[i].getX()[/left]

[left]posBOID_y = self.boids[i].getY()[/left]

[left]for ii in xrange(self.boidCOUNT):[/left]

[left]if (ii!=i):[/left]

[left]dis = posBOID_pos-self.boids[ii].getPOS()[/left]

[left]dis = dis.length()[/left]

[left][/left]

[left]if (dis > .1)and(dis < 2):[/left]

[left]base = posBOID_x-self.boids[ii].getX()[/left]

[left]heigh = posBOID_y-self.boids[ii].getY()[/left]

[left]self.veloX[i] += base*self.mass[i]/dis/100[/left]

[left]self.veloY[i] += heigh*self.mass[i]/dis/100[/left]

[left][/left]

[left]base = posBOID_x-self.boids[ii].getX()[/left]

[left]heigh = posBOID_y-self.boids[ii].getY()[/left]

[left]self.veloX[i] -= base*self.mass[i]*dis/100[/left]

[left]self.veloY[i] -= heigh*self.mass[i]*dis/100[/left]

[left]# self.collisionAIR(self.boids[ii].getY(),i,.01)[/left]

[left][/left]

[left]for ii in xrange(len(self.mag)):[/left]

[left]if (ii!=i):[/left]

[left]dis1 = posBOID_pos-self.mag[ii].getPOS()[/left]

[left]dis1 = dis1.length()[/left]

[left]base1 = posBOID_x-self.mag[ii].getX()[/left]

[left]heigh1 = posBOID_y-self.mag[ii].getY()[/left]

[left][/left]

[left]self.veloX[i] += -base1*self.massMAG[ii]/50[/left]

[left]self.veloY[i] += -heigh1*self.massMAG[ii]/50[/left]

[left]# self.mag[ii].setPOS(self.mag[ii].getX()+random.uniform(.02,-.02),10,self.mag[ii].getY()+random.uniform(.02,-.02) )[/left]

[left]for ii in xrange(len(self.shark)):[/left]

[left][/left]

[left]dis2 = posBOID_pos-self.shark[ii].getPOS()[/left]

[left]dis2 = dis2.length()[/left]

[left]base2 = posBOID_x-self.shark[ii].getX()[/left]

[left]heigh2 = posBOID_y-self.shark[ii].getY()[/left]

[left]if (dis2<1.5):[/left]

[left]self.veloX[i] += base2/dis2/1.2[/left]

[left]self.veloY[i] += heigh2/dis2/1.2[/left]

[left]self.color1 = Vec4(self.shark[ii].getCOLOR())[/left]

[left]# self.boids[i].setCOLOR(self.color1)[/left]

[left][/left]

[left]self.setVELO(i,0,self.mass[i])[/left]

[left][/left]

[left][/left]

[left]def setVELO(self,i,g,m):[/left]

[left]self.veloY[i]-=g*m[/left]

[left]self.veloX[i]=self.veloX[i]/1.002[/left]

[left]self.veloY[i]=self.veloY[i]/1.002[/left]

[left]self.boids[i].setPOS(self.boids[i].getX()+self.veloX[i]/1000,10,self.boids[i].getY()+self.veloY[i]/1000)[/left]

[left][/left]

[left]def setVELO_shark(self,ii,b,h,d,t,a):[/left]

[left]mode = 2[/left]

[left]self.veloX_shark[ii] += b/d/mode[/left]

[left]self.veloY_shark[ii] += h/d/mode[/left]

[left]self.veloX_shark[ii] = self.veloX_shark[ii]/1.00001[/left]

[left]self.veloY_shark[ii] = self.veloY_shark[ii]/1.00001[/left]

[left]self.shark[ii].setPOS(self.shark[ii].getX()+self.veloX_shark[ii]/800000,10,self.shark[ii].getY()+self.veloY_shark[ii]/800000)[/left]

[left][/left]

[left]def collisionAIR(self,posY,i,g):[/left]

[left]if (posY<0):[/left]

[left]heigh = posY-(0)[/left]

[left]self.veloY[i] += self.veloY[i]*heigh/10[/left]

[left][/left]

[left]def mainLOOP(self,task):[/left]

[left]self.move()[/left]

[left]self.time += .1[/left]

[left]return task.cont[/left]

[left][/left]

[left]main = main()[/left]

[left]run()[/left]

[left]

[/left]

[left]

[/left]


#2

it starts gettin“ alive :smiley:

some informations:
http://www.cgforum.at/forum/thread.php?postid=39245#post39245

download link -> http://www.cgforum.at/forum/attachment.php?attachmentid=3100

cheers
dirk

[left] [/left]

[left]

[/left]


#3

This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.