示例#1
0
def updatePlugIn(steerPlugIn, task):
    """custom update task for plug-ins"""

    global steerVehicles, vehicleAnimCtls
    # call update for plug-in
    dt = ClockObject.get_global_clock().get_dt()
    steerPlugIn.update(dt)
    # handle vehicle's animation
    for i in range(len(vehicleAnimCtls)):
        # get current velocity size
        currentVelSize = steerVehicles[i].get_speed()
        if currentVelSize > 0.0:
            if currentVelSize < 4.0:
                animOnIdx = 0
            else:
                animOnIdx = 1
            animOffIdx = (animOnIdx + 1) % 2
            # Off anim (0:walk, 1:run)
            if vehicleAnimCtls[i][animOffIdx].is_playing():
                vehicleAnimCtls[i][animOffIdx].stop()
            # On amin (0:walk, 1:run)
            vehicleAnimCtls[i][animOnIdx].set_play_rate(
                currentVelSize / animRateFactor[animOnIdx])
            if not vehicleAnimCtls[i][animOnIdx].is_playing():
                vehicleAnimCtls[i][animOnIdx].loop(True)
        else:
            # stop any animation
            vehicleAnimCtls[i][0].stop()
            vehicleAnimCtls[i][1].stop()
    #
    return task.cont
示例#2
0
def updateNavMesh(navMesh, task):
    """custom path finding update task to correct panda's Z to stay on floor"""

    global crowdAgent
    # call update for navMesh
    dt = ClockObject.get_global_clock().get_dt()
    navMesh.update(dt)
    # handle crowd agents' animation
    for i in range(NUMAGENTS):
        # get current velocity size
        currentVelSize = crowdAgent[i].get_actual_velocity().length()
        if currentVelSize > 0.0:
            # walk
            agentAnimCtls[i][0].set_play_rate(currentVelSize / rateFactor)
            if not agentAnimCtls[i][0].is_playing():
                agentAnimCtls[i][0].loop(True)
        else:
            # check if crowd agent is on off mesh connection
            if crowdAgent[i].get_traversing_state(
            ) == RNCrowdAgent.STATE_OFFMESH:
                # off-balance
                if not agentAnimCtls[i][1].is_playing():
                    agentAnimCtls[i][1].loop(True)
            else:
                # stop any animation
                agentAnimCtls[i][0].stop()
                agentAnimCtls[i][1].stop()
    #
    return task.cont
示例#3
0
    def run_logic(self, task):
        """Run the logic for this camera manager."""
        #Get delta time
        dt = ClockObject.get_global_clock().get_dt()

        #We only need to execute logic for the free camera here
        if self.mode == CAM_MODE_FREE:
            #Update rotation first
            base.camera.set_hpr(base.camera.get_hpr() + self.rot_vec * dt)

            #Now update position
            pos = base.camera.get_pos()
            vec = Vec3(self.move_vec.x, self.move_vec.y, 0) * dt
            base.camera.set_pos(pos + base.camera.get_quat(render).xform(vec))
            base.camera.set_z(base.camera.get_z() + self.move_vec.z * dt)

        #Continue this task infinitely
        return Task.cont
def updatePlugIn(steerPlugIn, task):
    """custom update task for plug-ins"""
    
    global steerVehicles, vehicleAnimCtls
    # call update for plug-in
    dt = ClockObject.get_global_clock().get_dt()
    steerPlugIn.update(dt)
    # handle vehicle's animation
    for i in range(len(vehicleAnimCtls)):
        # get current velocity size
        currentVelSize = steerVehicles[i].get_speed()
        if currentVelSize > 0.0:
            if currentVelSize < 4.0: 
                animOnIdx = 0
            else:
                animOnIdx = 1
            animOffIdx = (animOnIdx + 1) % 2
            # Off anim (0:walk, 1:run)
            if vehicleAnimCtls[i][animOffIdx].is_playing():
                vehicleAnimCtls[i][animOffIdx].stop()
            # On amin (0:walk, 1:run)
            vehicleAnimCtls[i][animOnIdx].set_play_rate(currentVelSize / animRateFactor[animOnIdx])
            if not vehicleAnimCtls[i][animOnIdx].is_playing():
                vehicleAnimCtls[i][animOnIdx].loop(True)
        else:
            # stop any animation
            vehicleAnimCtls[i][0].stop()
            vehicleAnimCtls[i][1].stop()
    # make playerNP kinematic (ie stand on floor)
    if playerNP.node().get_speed() > 0.0:
        # get steer manager
        steerMgr = OSSteerManager.get_global_ptr()
        # correct panda's Z: set the collision ray origin wrt collision root
        pOrig = steerMgr.get_collision_root().get_relative_point(
                steerMgr.get_reference_node_path(), playerNP.get_pos()) + playerHeightRayCast * 2.0
        # get the collision height wrt the reference node path
        gotCollisionZ = steerMgr.get_collision_height(pOrig, steerMgr.get_reference_node_path())
        if gotCollisionZ.get_first():
            #updatedPos.z needs correction
            playerNP.set_z(gotCollisionZ.get_second())
    #
    return task.cont
示例#5
0
 def update(self, task):
     #
     dt = ClockObject.get_global_clock().get_dt()
     #handle mouse
     if self.mMouseMove and (self.mMouseEnabledH or self.mMouseEnabledP):
         md = self.mWin.get_pointer(0)
         deltaX = md.get_x() - self.mCentX
         deltaY = md.get_y() - self.mCentY
 
         if self.mWin.move_pointer(0, self.mCentX, self.mCentY):
             if self.mMouseEnabledH and (deltaX != 0.0):
                 self.mOwnerObjectNP.set_h(
                         self.mOwnerObjectNP.get_h() - deltaX * self.mSensX * self.mSignOfMouse)
             if self.mMouseEnabledP and (deltaY != 0.0):
                 self.mOwnerObjectNP.set_p(
                         self.mOwnerObjectNP.get_p() - deltaY * self.mSensY * self.mSignOfMouse)
         #if self.mMouseMoveKey is True we are controlling mouse movements
         #so we need to reset self.mMouseMove to False
         if self.mMouseMoveKey:
             self.mMouseMove = False
     #update position/orientation
     self.mOwnerObjectNP.set_y(self.mOwnerObjectNP,
             self.mActualSpeedXYZ.get_y() * dt * self.mSignOfTranslation)
     self.mOwnerObjectNP.set_x(self.mOwnerObjectNP,
             self.mActualSpeedXYZ.get_x() * dt * self.mSignOfTranslation)
     self.mOwnerObjectNP.set_z(self.mOwnerObjectNP, self.mActualSpeedXYZ.get_z() * dt)
     #head
     if self.mHeadLimitEnabled:
         head = self.mOwnerObjectNP.get_h() + self.mActualSpeedH * dt * self.mSignOfMouse
         if head > self.mHLimit:
             head = self.mHLimit
         elif head < -self.mHLimit:
             head = -self.mHLimit
         self.mOwnerObjectNP.set_h(head)
     else:
         self.mOwnerObjectNP.set_h(
                 self.mOwnerObjectNP.get_h() + self.mActualSpeedH * dt * self.mSignOfMouse)
     #pitch
     if self.mPitchLimitEnabled:
         pitch = self.mOwnerObjectNP.get_p() + self.mActualSpeedP * dt * self.mSignOfMouse
         if pitch > self.mPLimit:
             pitch = self.mPLimit
         elif pitch < -self.mPLimit:
             pitch = -self.mPLimit
         self.mOwnerObjectNP.set_p(pitch)
     else:
         self.mOwnerObjectNP.set_p(
                 self.mOwnerObjectNP.get_p() + self.mActualSpeedP * dt * self.mSignOfMouse)
 
     #update speeds
     #y axis
     if self.mForward and (not self.mBackward):
         if self.mAccelXYZ.get_y() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_y(
                     self.mActualSpeedXYZ.get_y() - self.mAccelXYZ.get_y() * dt)
             if self.mActualSpeedXYZ.get_y() < -self.mMaxSpeedXYZ.get_y():
                 #limit speed
                 self.mActualSpeedXYZ.set_y(-self.mMaxSpeedXYZ.get_y())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_y(-self.mMaxSpeedXYZ.get_y())
     elif self.mBackward and (not self.mForward):
         if self.mAccelXYZ.get_y() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_y(
                     self.mActualSpeedXYZ.get_y() + self.mAccelXYZ.get_y() * dt)
             if self.mActualSpeedXYZ.get_y() > self.mMaxSpeedXYZ.get_y():
                 #limit speed
                 self.mActualSpeedXYZ.set_y(self.mMaxSpeedXYZ.get_y())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_y(self.mMaxSpeedXYZ.get_y())
     elif self.mActualSpeedXYZ.get_y() != 0.0:
         if self.mActualSpeedXYZ.get_y() * self.mActualSpeedXYZ.get_y() \
                 < self.mMaxSpeedSquaredXYZ.get_y() * self.mStopThreshold:
             #stop
             self.mActualSpeedXYZ.set_y(0.0)
         else:
             #decelerate
             self.mActualSpeedXYZ.set_y(
                     self.mActualSpeedXYZ.get_y() * (1.0 - min(self.mFrictionXYZ * dt, 1.0)))
     #x axis
     if self.mStrafeLeft and (not self.mStrafeRight):
         if self.mAccelXYZ.get_x() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_x(
                     self.mActualSpeedXYZ.get_x() + self.mAccelXYZ.get_x() * dt)
             if self.mActualSpeedXYZ.get_x() > self.mMaxSpeedXYZ.get_x():
                 #limit speed
                 self.mActualSpeedXYZ.set_x(self.mMaxSpeedXYZ.get_x())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_x(self.mMaxSpeedXYZ.get_x())
     elif self.mStrafeRight and (not self.mStrafeLeft):
         if self.mAccelXYZ.get_x() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_x(
                     self.mActualSpeedXYZ.get_x() - self.mAccelXYZ.get_x() * dt)
             if self.mActualSpeedXYZ.get_x() < -self.mMaxSpeedXYZ.get_x():
                 #limit speed
                 self.mActualSpeedXYZ.set_x(-self.mMaxSpeedXYZ.get_x())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_x(-self.mMaxSpeedXYZ.get_y())
     elif self.mActualSpeedXYZ.get_x() != 0.0:
         if self.mActualSpeedXYZ.get_x() * self.mActualSpeedXYZ.get_x() \
                 < self.mMaxSpeedSquaredXYZ.get_x() * self.mStopThreshold:
             #stop
             self.mActualSpeedXYZ.set_x(0.0)
         else:
             #decelerate
             self.mActualSpeedXYZ.set_x(
                     self.mActualSpeedXYZ.get_x() * (1.0 - min(self.mFrictionXYZ * dt, 1.0)))
     #z axis
     if self.mUp and (not self.mDown):
         if self.mAccelXYZ.get_z() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_z(
                     self.mActualSpeedXYZ.get_z() + self.mAccelXYZ.get_z() * dt)
             if self.mActualSpeedXYZ.get_z() > self.mMaxSpeedXYZ.get_z():
                 #limit speed
                 self.mActualSpeedXYZ.set_z(self.mMaxSpeedXYZ.get_z())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_z(self.mMaxSpeedXYZ.get_z())
     elif self.mDown and (not self.mUp):
         if self.mAccelXYZ.get_z() != 0.0:
             #accelerate
             self.mActualSpeedXYZ.set_z(
                     self.mActualSpeedXYZ.get_z() - self.mAccelXYZ.get_z() * dt)
             if self.mActualSpeedXYZ.get_z() < -self.mMaxSpeedXYZ.get_z():
                 #limit speed
                 self.mActualSpeedXYZ.set_z(-self.mMaxSpeedXYZ.get_z())
         else:
             #kinematic
             self.mActualSpeedXYZ.set_z(-self.mMaxSpeedXYZ.get_z())
     elif self.mActualSpeedXYZ.get_z() != 0.0:
         if self.mActualSpeedXYZ.get_z() * self.mActualSpeedXYZ.get_z() \
                 < self.mMaxSpeedSquaredXYZ.get_z() * self.mStopThreshold:
             #stop
             self.mActualSpeedXYZ.set_z(0.0)
         else:
             #decelerate
             self.mActualSpeedXYZ.set_z(
                     self.mActualSpeedXYZ.get_z() * (1.0 - min(self.mFrictionXYZ * dt, 1.0)))
     #rotation h
     if self.mHeadLeft and (not self.mHeadRight):
         if self.mAccelHP != 0.0:
             #accelerate
             self.mActualSpeedH += self.mAccelHP * dt
             if self.mActualSpeedH > self.mMaxSpeedHP:
                 #limit speed
                 self.mActualSpeedH = self.mMaxSpeedHP
         else:
             #kinematic
             self.mActualSpeedH = self.mMaxSpeedHP
     elif self.mHeadRight and (not self.mHeadLeft):
         if self.mAccelHP != 0.0:
             #accelerate
             self.mActualSpeedH -= self.mAccelHP * dt
             if self.mActualSpeedH < -self.mMaxSpeedHP:
                 #limit speed
                 self.mActualSpeedH = -self.mMaxSpeedHP
         else:
             #kinematic
             self.mActualSpeedH = -self.mMaxSpeedHP
     elif self.mActualSpeedH != 0.0:
         if self.mActualSpeedH * self.mActualSpeedH < self.mMaxSpeedSquaredHP * self.mStopThreshold:
             #stop
             self.mActualSpeedH = 0.0
         else:
             #decelerate
             self.mActualSpeedH = self.mActualSpeedH * (1.0 - min(self.mFrictionHP * dt, 1.0))
     #rotation p
     if self.mPitchUp and (not self.mPitchDown):
         if self.mAccelHP != 0.0:
             #accelerate
             self.mActualSpeedP += self.mAccelHP * dt
             if self.mActualSpeedP > self.mMaxSpeedHP:
                 #limit speed
                 self.mActualSpeedP = self.mMaxSpeedHP
         else:
             #kinematic
             self.mActualSpeedP = self.mMaxSpeedHP
     elif self.mPitchDown and (not self.mPitchUp):
         if self.mAccelHP != 0.0:
             #accelerate
             self.mActualSpeedP -= self.mAccelHP * dt
             if self.mActualSpeedP < -self.mMaxSpeedHP:
                 #limit speed
                 self.mActualSpeedP = -self.mMaxSpeedHP
         else:
             #kinematic
             self.mActualSpeedP = -self.mMaxSpeedHP
     elif self.mActualSpeedP != 0.0:
         if self.mActualSpeedP * self.mActualSpeedP < self.mMaxSpeedSquaredHP * self.mStopThreshold:
             #stop
             self.mActualSpeedP = 0.0
         else:
             #decelerate
             self.mActualSpeedP = self.mActualSpeedP * (1.0 - min(self.mFrictionHP * dt, 1.0))        
             #
     return task.cont
示例#6
0
    print("reparent sceneNP to the reference node")
    sceneNP.reparent_to(navMesMgr.get_reference_node_path())

    print("get the agent model")
    agentNP = app.loader.load_model("eve.egg")
    agentNP.set_scale(0.40)

    print(
        "create the crowd agent (it is attached to the reference node) and set its position"
    )
    crowdAgentNP = navMesMgr.create_crowd_agent("crowdAgent")
    crowdAgent = crowdAgentNP.node()
    crowdAgentNP.set_pos(24.0, -20.4, -2.37)
    crowdAgent.set_update_callback(crowdAgentCallback)
    globalClock = ClockObject.get_global_clock()

    print("attach the agent model to crowdAgent")
    agentNP.reparent_to(crowdAgentNP)

    print("attach the crowd agent to the nav mesh")
    navMesh.add_crowd_agent(crowdAgentNP)
    print(str(crowdAgent) + " added to: " + str(crowdAgent.get_nav_mesh()))

    print("start the path finding default update task")
    navMesMgr.start_default_update()

    print(
        "DEBUG DRAWING: make the debug reference node path sibling of the reference node"
    )
    navMesMgr.get_reference_node_path_debug().reparent_to(app.render)