class PathFollower(soya.World): """A World that Follows the path of the points. PathFollower(parent,points,model)""" def __init__(self,parent,points,model,speed): soya.World.__init__(self,parent) self.points = points self.speed = speed self.modela = model self.follower = soya.Body(self,self.modela) self.state1 = soya.CoordSystState(self) self.state2 = soya.CoordSystState(self) self.cur_point = 0 self.state1.move(self.points[self.cur_point]) self.state2.move(self.points[self.cur_point+1]) self.factor = 1.0 self.maxpoint = len(points) def begin_round(self): soya.World.begin_round(self) #print self.distance_to(self.points[self.cur_point]) #print self.factor if self.factor > 1: self.cur_point = self.cur_point +1 if self.maxpoint == self.cur_point: self.cur_point = 0 self.state1.move(self.points[self.cur_point-1]) self.state2.move(self.points[self.cur_point]) self.state1.look_at(self.points[self.cur_point]) try: self.state2.look_at(self.points[self.cur_point+1]) except IndexError: self.state2.look_at(self.points[0]) #self.follower.look_at(self.points[self.cur_point]) self.factor = 0 def advance_time(self,p): soya.World.advance_time(self,p) self.factor += self.speed * p self.interpolate(self.state1, self.state2, self.factor) #self.add_mul_vector(p,self.speed) mypath = [soya.Point(scene, 3,0,0), soya.Point(scene, 0,-5,-1), soya.Point(scene, 2,0,-3), soya.Point(scene, -2,0,-5)] mymodel = soya.Model.get("caterpillar_head") follower = PathFollower(scene,mypath,mymodel,0.05)