Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
 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)