didur
12-13-2010, 07:53 PM
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).
#boid system v. 0.1 SHARK ATTACK
#dirk hochegger 2010
#
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from panda3d.core import GraphicsOutput
from panda3d.core import Filename,Texture
from direct.task.Task import Task
from panda3d.core import Vec4, Vec3, NodePath,RigidBodyCombiner
from direct.filter.CommonFilters import CommonFilters
import math,random
rbc = RigidBodyCombiner("rbc")
rbcnp = NodePath(rbc)
class shark:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.shark = NodePath()
def paint (self):
self.shark = loader.loadModel("plane")
self.shark.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.shark.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.shark.setPos(x,y,z)
def getPOS(self):
return self.shark.getPos()
def getX(self):
return self.shark.getX()
def getY(self):
return self.shark.getZ()
def setSCALE(self,sx,sy,sz):
self.shark.setScale(sx,sy,sz)
def setCOLOR(self,color):
self.shark.setColor(color)
def getCOLOR(self):
return self.shark.getColor()
class boid:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.boid = NodePath()
def paint (self):
self.boid = loader.loadModel("plane")
self.boid.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.boid.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.boid.setPos(x,y,z)
def getPOS(self):
return self.boid.getPos()
def getX(self):
return self.boid.getX()
def getY(self):
return self.boid.getZ()
def setSCALE(self,sx,sy,sz):
self.boid.setScale(sx,sy,sz)
def remove (self):
self.boid.removeNode()
def setCOLOR(self,color):
self.boid.setColor(color)
class magnet:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
color=Vec4(0,0,0,0)
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.mag = NodePath()
def paint (self):
self.mag = loader.loadModel("plane")
self.mag.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.mag.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.mag.setPos(x,y,z)
def getPOS(self):
return self.mag.getPos()
def getX(self):
return self.mag.getX()
def getY(self):
return self.mag.getZ()
def setSCALE(self,sx,sy,sz):
self.mag.setScale(sx,sy,sz)
def setCOLOR(self,color):
self.mag.setColor(color)
class main(DirectObject):
def __init__(self):
base.disableMouse()
base.setBackgroundColor(0,0,0,1)
self.tex = Texture()
self.tex.setMinfilter(Texture.FTLinear)
base.win.addRenderTexture(self.tex, GraphicsOutput.RTMTriggeredCopyTexture)
base.camera.setY(-15)
self.backcam = base.makeCamera2d(base.win, sort=-10)
self.background = NodePath("background")
self.backcam.reparentTo(self.background)
self.background.setDepthTest(0)
self.background.setDepthWrite(0)
self.backcam.node().getDisplayRegion(0).setClearDepthActive(0)
self.backCARD = base.win.getTextureCard()
self.backCARD.reparentTo(self.background)
self.backCARD.setTransparency(1)
self.frontCARD = base.win.getTextureCard()
self.frontCARD.reparentTo(render2d)
self.frontCARD.setTransparency(1)
self.motionTRAIL()
taskMgr.add(self.snapSHOT, "snapSHOT")
self.clickrate = 2000
if (base.win.getGsg().getCopyTextureInverted()):
self.backCARD.setScale(1,1,-1)
self.frontCARD.setScale(1,1,-1)
self.boids={}
self.mag={}
self.shark = {}
self.massMAG={}
self.mass = {}
self.veloX = {}
self.veloY = {}
self.veloX_shark = {}
self.veloY_shark = {}
self.freq = 0.0
self.time = 0.0
self.boidCOUNT = 0
# self.color1 = Vec4(1.0,1.0,1.0,.98)
for i in xrange(50):
self.create(i)
for i in xrange(4):
self.createMAG(i)
for i in xrange(4):
self.createSHARK(i)
taskMgr.add(self.mainLOOP, "ml")
def snapSHOT(self, task):
if (task.time > self.nextclick):
self.nextclick += 1 / self.clickrate
if (self.nextclick < task.time):
self.nextclick = task.time
base.win.triggerCopy()
return Task.cont
def motionTRAIL(self):
self.backCARD.show()
self.frontCARD.setColor(1,1,1,.98)
self.frontCARD.setPos(-.001,0,.001)
self.nextclick = 0
def createSHARK(self,i):
self.veloX_shark[i] = .1
self.veloY_shark[i] = .1
self.shark[i] = shark()
self.shark[i].paint()
self.shark[i].renderTO(render)
self.shark[i].setPOS(random.uniform(10.0,-10),10,random.uniform(10.0,-10))
self.shark[i].setSCALE(.14,.1,.14)
self.shark[i].setCOLOR(Vec4(random.uniform(0.4,1.0),0,0,random.uniform(0.0,1.0)))
def createMAG(self,i):
self.mag[i] = magnet()
self.massMAG[i] = random.uniform(.1,1)
self.mag[i].paint()
self.mag[i].setPOS(random.uniform(6.0,-6),10,random.uniform(6.0,-6))
# self.mag[i].renderTO(render)
self.mag[i].setCOLOR(Vec4(self.massMAG[i],0,0,random.uniform(0.0,1.0)))
def create(self,i):
self.mass[i] = random.uniform(.2,1)
self.veloX[i] = .1
self.veloY[i] = .1
self.boids[i]=boid()
self.boids[i].paint()
self.boids[i].setSCALE(.1,.08,.1)
self.boids[i].setPOS(random.uniform(1.0,-1),10,random.uniform(1.0,-1))
self.boids[i].renderTO(rbcnp)
self.boids[i].setCOLOR(Vec4(0,random.uniform(0.1,.9),random.uniform(0.0,.15),random.uniform(1,1.0)))
def attack(self,i):
attack =0
for ii in xrange(len(self.shark)):
if (i!=ii):
dis = self.boids[i].getPOS()-self.shark[ii].getPOS()
dis = dis.length()
base = self.boids[i].getX()-self.shark[ii].getX()
heigh = self.boids[i].getY()-self.shark[ii].getY()
if (dis > 5):
attack = 1
self.setVELO_shark(ii,base,heigh,dis,self.time,attack)
def move(self):
self.freq+=.1
self.boidCOUNT = len(self.boids)
for i in xrange(self.boidCOUNT):
self.attack(i)
#get velo neighbour
posBOID_pos = self.boids[i].getPOS()
posBOID_x = self.boids[i].getX()
posBOID_y = self.boids[i].getY()
for ii in xrange(self.boidCOUNT):
if (ii!=i):
dis = posBOID_pos-self.boids[ii].getPOS()
dis = dis.length()
if (dis > .1)and(dis < 2):
base = posBOID_x-self.boids[ii].getX()
heigh = posBOID_y-self.boids[ii].getY()
self.veloX[i] += base*self.mass[i]/dis/100
self.veloY[i] += heigh*self.mass[i]/dis/100
base = posBOID_x-self.boids[ii].getX()
heigh = posBOID_y-self.boids[ii].getY()
self.veloX[i] -= base*self.mass[i]*dis/100
self.veloY[i] -= heigh*self.mass[i]*dis/100
# self.collisionAIR(self.boids[ii].getY(),i,.01)
for ii in xrange(len(self.mag)):
if (ii!=i):
dis1 = posBOID_pos-self.mag[ii].getPOS()
dis1 = dis1.length()
base1 = posBOID_x-self.mag[ii].getX()
heigh1 = posBOID_y-self.mag[ii].getY()
self.veloX[i] += -base1*self.massMAG[ii]/50
self.veloY[i] += -heigh1*self.massMAG[ii]/50
# self.mag[ii].setPOS(self.mag[ii].getX()+random.uniform(.02,-.02),10,self.mag[ii].getY()+random.uniform(.02,-.02) )
for ii in xrange(len(self.shark)):
dis2 = posBOID_pos-self.shark[ii].getPOS()
dis2 = dis2.length()
base2 = posBOID_x-self.shark[ii].getX()
heigh2 = posBOID_y-self.shark[ii].getY()
if (dis2<1.5):
self.veloX[i] += base2/dis2/1.2
self.veloY[i] += heigh2/dis2/1.2
self.color1 = Vec4(self.shark[ii].getCOLOR())
# self.boids[i].setCOLOR(self.color1)
self.setVELO(i,0,self.mass[i])
def setVELO(self,i,g,m):
self.veloY[i]-=g*m
self.veloX[i]=self.veloX[i]/1.002
self.veloY[i]=self.veloY[i]/1.002
self.boids[i].setPOS(self.boids[i].getX()+self.veloX[i]/1000,10,self.boids[i].getY()+self.veloY[i]/1000)
def setVELO_shark(self,ii,b,h,d,t,a):
mode = 2
self.veloX_shark[ii] += b/d/mode
self.veloY_shark[ii] += h/d/mode
self.veloX_shark[ii] = self.veloX_shark[ii]/1.00001
self.veloY_shark[ii] = self.veloY_shark[ii]/1.00001
self.shark[ii].setPOS(self.shark[ii].getX()+self.veloX_shark[ii]/800000,10,self.shark[ii].getY()+self.veloY_shark[ii]/800000)
def collisionAIR(self,posY,i,g):
if (posY<0):
heigh = posY-(0)
self.veloY[i] += self.veloY[i]*heigh/10
def mainLOOP(self,task):
self.move()
self.time += .1
return task.cont
main = main()
run()
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).
#boid system v. 0.1 SHARK ATTACK
#dirk hochegger 2010
#
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from panda3d.core import GraphicsOutput
from panda3d.core import Filename,Texture
from direct.task.Task import Task
from panda3d.core import Vec4, Vec3, NodePath,RigidBodyCombiner
from direct.filter.CommonFilters import CommonFilters
import math,random
rbc = RigidBodyCombiner("rbc")
rbcnp = NodePath(rbc)
class shark:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.shark = NodePath()
def paint (self):
self.shark = loader.loadModel("plane")
self.shark.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.shark.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.shark.setPos(x,y,z)
def getPOS(self):
return self.shark.getPos()
def getX(self):
return self.shark.getX()
def getY(self):
return self.shark.getZ()
def setSCALE(self,sx,sy,sz):
self.shark.setScale(sx,sy,sz)
def setCOLOR(self,color):
self.shark.setColor(color)
def getCOLOR(self):
return self.shark.getColor()
class boid:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.boid = NodePath()
def paint (self):
self.boid = loader.loadModel("plane")
self.boid.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.boid.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.boid.setPos(x,y,z)
def getPOS(self):
return self.boid.getPos()
def getX(self):
return self.boid.getX()
def getY(self):
return self.boid.getZ()
def setSCALE(self,sx,sy,sz):
self.boid.setScale(sx,sy,sz)
def remove (self):
self.boid.removeNode()
def setCOLOR(self,color):
self.boid.setColor(color)
class magnet:
def __init__(self):
self.velo = {}
x = 0.0
y = 0.0
z = 0.0
color=Vec4(0,0,0,0)
sx = random.uniform(4.0,-4)
sy = 10
sz = random.uniform(4.0,-4)
renderTYPE = None
self.mag = NodePath()
def paint (self):
self.mag = loader.loadModel("plane")
self.mag.setTag("Blur Shading", "True")
def renderTO(self,renderTYPE):
rbcnp.reparentTo(render)
self.mag.reparentTo(renderTYPE)
rbc.collect()
def setPOS(self,x,y,z):
self.mag.setPos(x,y,z)
def getPOS(self):
return self.mag.getPos()
def getX(self):
return self.mag.getX()
def getY(self):
return self.mag.getZ()
def setSCALE(self,sx,sy,sz):
self.mag.setScale(sx,sy,sz)
def setCOLOR(self,color):
self.mag.setColor(color)
class main(DirectObject):
def __init__(self):
base.disableMouse()
base.setBackgroundColor(0,0,0,1)
self.tex = Texture()
self.tex.setMinfilter(Texture.FTLinear)
base.win.addRenderTexture(self.tex, GraphicsOutput.RTMTriggeredCopyTexture)
base.camera.setY(-15)
self.backcam = base.makeCamera2d(base.win, sort=-10)
self.background = NodePath("background")
self.backcam.reparentTo(self.background)
self.background.setDepthTest(0)
self.background.setDepthWrite(0)
self.backcam.node().getDisplayRegion(0).setClearDepthActive(0)
self.backCARD = base.win.getTextureCard()
self.backCARD.reparentTo(self.background)
self.backCARD.setTransparency(1)
self.frontCARD = base.win.getTextureCard()
self.frontCARD.reparentTo(render2d)
self.frontCARD.setTransparency(1)
self.motionTRAIL()
taskMgr.add(self.snapSHOT, "snapSHOT")
self.clickrate = 2000
if (base.win.getGsg().getCopyTextureInverted()):
self.backCARD.setScale(1,1,-1)
self.frontCARD.setScale(1,1,-1)
self.boids={}
self.mag={}
self.shark = {}
self.massMAG={}
self.mass = {}
self.veloX = {}
self.veloY = {}
self.veloX_shark = {}
self.veloY_shark = {}
self.freq = 0.0
self.time = 0.0
self.boidCOUNT = 0
# self.color1 = Vec4(1.0,1.0,1.0,.98)
for i in xrange(50):
self.create(i)
for i in xrange(4):
self.createMAG(i)
for i in xrange(4):
self.createSHARK(i)
taskMgr.add(self.mainLOOP, "ml")
def snapSHOT(self, task):
if (task.time > self.nextclick):
self.nextclick += 1 / self.clickrate
if (self.nextclick < task.time):
self.nextclick = task.time
base.win.triggerCopy()
return Task.cont
def motionTRAIL(self):
self.backCARD.show()
self.frontCARD.setColor(1,1,1,.98)
self.frontCARD.setPos(-.001,0,.001)
self.nextclick = 0
def createSHARK(self,i):
self.veloX_shark[i] = .1
self.veloY_shark[i] = .1
self.shark[i] = shark()
self.shark[i].paint()
self.shark[i].renderTO(render)
self.shark[i].setPOS(random.uniform(10.0,-10),10,random.uniform(10.0,-10))
self.shark[i].setSCALE(.14,.1,.14)
self.shark[i].setCOLOR(Vec4(random.uniform(0.4,1.0),0,0,random.uniform(0.0,1.0)))
def createMAG(self,i):
self.mag[i] = magnet()
self.massMAG[i] = random.uniform(.1,1)
self.mag[i].paint()
self.mag[i].setPOS(random.uniform(6.0,-6),10,random.uniform(6.0,-6))
# self.mag[i].renderTO(render)
self.mag[i].setCOLOR(Vec4(self.massMAG[i],0,0,random.uniform(0.0,1.0)))
def create(self,i):
self.mass[i] = random.uniform(.2,1)
self.veloX[i] = .1
self.veloY[i] = .1
self.boids[i]=boid()
self.boids[i].paint()
self.boids[i].setSCALE(.1,.08,.1)
self.boids[i].setPOS(random.uniform(1.0,-1),10,random.uniform(1.0,-1))
self.boids[i].renderTO(rbcnp)
self.boids[i].setCOLOR(Vec4(0,random.uniform(0.1,.9),random.uniform(0.0,.15),random.uniform(1,1.0)))
def attack(self,i):
attack =0
for ii in xrange(len(self.shark)):
if (i!=ii):
dis = self.boids[i].getPOS()-self.shark[ii].getPOS()
dis = dis.length()
base = self.boids[i].getX()-self.shark[ii].getX()
heigh = self.boids[i].getY()-self.shark[ii].getY()
if (dis > 5):
attack = 1
self.setVELO_shark(ii,base,heigh,dis,self.time,attack)
def move(self):
self.freq+=.1
self.boidCOUNT = len(self.boids)
for i in xrange(self.boidCOUNT):
self.attack(i)
#get velo neighbour
posBOID_pos = self.boids[i].getPOS()
posBOID_x = self.boids[i].getX()
posBOID_y = self.boids[i].getY()
for ii in xrange(self.boidCOUNT):
if (ii!=i):
dis = posBOID_pos-self.boids[ii].getPOS()
dis = dis.length()
if (dis > .1)and(dis < 2):
base = posBOID_x-self.boids[ii].getX()
heigh = posBOID_y-self.boids[ii].getY()
self.veloX[i] += base*self.mass[i]/dis/100
self.veloY[i] += heigh*self.mass[i]/dis/100
base = posBOID_x-self.boids[ii].getX()
heigh = posBOID_y-self.boids[ii].getY()
self.veloX[i] -= base*self.mass[i]*dis/100
self.veloY[i] -= heigh*self.mass[i]*dis/100
# self.collisionAIR(self.boids[ii].getY(),i,.01)
for ii in xrange(len(self.mag)):
if (ii!=i):
dis1 = posBOID_pos-self.mag[ii].getPOS()
dis1 = dis1.length()
base1 = posBOID_x-self.mag[ii].getX()
heigh1 = posBOID_y-self.mag[ii].getY()
self.veloX[i] += -base1*self.massMAG[ii]/50
self.veloY[i] += -heigh1*self.massMAG[ii]/50
# self.mag[ii].setPOS(self.mag[ii].getX()+random.uniform(.02,-.02),10,self.mag[ii].getY()+random.uniform(.02,-.02) )
for ii in xrange(len(self.shark)):
dis2 = posBOID_pos-self.shark[ii].getPOS()
dis2 = dis2.length()
base2 = posBOID_x-self.shark[ii].getX()
heigh2 = posBOID_y-self.shark[ii].getY()
if (dis2<1.5):
self.veloX[i] += base2/dis2/1.2
self.veloY[i] += heigh2/dis2/1.2
self.color1 = Vec4(self.shark[ii].getCOLOR())
# self.boids[i].setCOLOR(self.color1)
self.setVELO(i,0,self.mass[i])
def setVELO(self,i,g,m):
self.veloY[i]-=g*m
self.veloX[i]=self.veloX[i]/1.002
self.veloY[i]=self.veloY[i]/1.002
self.boids[i].setPOS(self.boids[i].getX()+self.veloX[i]/1000,10,self.boids[i].getY()+self.veloY[i]/1000)
def setVELO_shark(self,ii,b,h,d,t,a):
mode = 2
self.veloX_shark[ii] += b/d/mode
self.veloY_shark[ii] += h/d/mode
self.veloX_shark[ii] = self.veloX_shark[ii]/1.00001
self.veloY_shark[ii] = self.veloY_shark[ii]/1.00001
self.shark[ii].setPOS(self.shark[ii].getX()+self.veloX_shark[ii]/800000,10,self.shark[ii].getY()+self.veloY_shark[ii]/800000)
def collisionAIR(self,posY,i,g):
if (posY<0):
heigh = posY-(0)
self.veloY[i] += self.veloY[i]*heigh/10
def mainLOOP(self,task):
self.move()
self.time += .1
return task.cont
main = main()
run()
