def update(self,time): self._pos.update() self._target.update() look_at = self._track_obj.getPosition()+(0,0,0.6) cam_pos = look_at -self._track_obj.getFrontVector() * 2.0 + N.array((0,0,0.0)) self._pos.impulseTowards(cam_pos) self._target.impulseTowards(look_at) # see if the camera doesn't intersect geometry. If it does, push it up cam_pos =self._pos.getPosition() look_at = self._target._position dv = cam_pos - look_at dist = T.vector_norm(dv[0:2]) # distance across floor n = math.ceil(dist / 0.2) z0 = look_at[2] dray = dv / n m = self._map hit = False # ray-march #z_list = [] ray_pos = look_at + dray # advance once for i in xrange(1,int(n)+3): # start at i=1 to avoid division by zero z = m(ray_pos[0], ray_pos[1], False)+0.4 # is an offset so the camera can see #z_list.append(int(z*10)) if z > ray_pos[2]: slope = (z-z0) / float(i) #if slope > 0.1: # ray_pos -= dray # go back one step # break dray[2] = slope ray_pos[2] = z hit = True ray_pos += dray ray_pos -= dray*3 #print z_list #print "%s -> %s %s" % (self._pos.getPosition(), ray_pos, "HIT" if hit else "") if hit: self._pos.moveTo(ray_pos)
def update(self, time): self._lock = None # ----- here be dragons ph = self._phys ph._impuse = ph._gravity ph.update() # test for collision with map z, normal = self._map(ph._position[0], ph._position[1]) h = (z + self._radius) - ph._position[2] T.unit_vector(normal, out=normal) self._on_floor = h > 0 if self._on_floor and ph._position[2] < ph._last_position[2]: # collision ph._impulse += h * normal * 0.00001 # * normal[2] ph._position[2] += h ph._last_position[2] += h new_pos = ph._position # ----- self._dir = new_pos - self._pos self._speed = T.vector_norm(self._dir) self._last_pos[:] = new_pos Entity.moveTo(self, new_pos) # updates self._pos too self._normal = normal self._axis = N.cross(self._dir, normal) self.roll(self._axis)
def roll(self, axis): len = T.vector_norm(axis) * 5.0 rot = T.quaternion_about_axis(-len, axis) self._rotation = T.quaternion_multiply(rot, self._rotation)