PDA

View Full Version : boids (xmas, a tiny xmas present)


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()

didur
12-15-2010, 09:34 PM
it starts gettinī alive :D

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

CGTalk Moderation
12-15-2010, 09:34 PM
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.