def rotateAround(self, node, point, axis, angle, relative): quat = Quat() quat.setFromAxisAngle(angle, render.getRelativeVector(relative, axis)) relativePos = node.getPos(render) - point relativePosRotated = quat.xform(relativePos) absolutePosRotated = relativePosRotated + point node.setPos(render, absolutePosRotated) node.setQuat(render, node.getQuat(render) * quat)
def drag(self, task): if not base.mouseWatcherNode.hasMouse(): return Task.cont curMouseCoord = (base.mouseWatcherNode.getMouseX(), base.mouseWatcherNode.getMouseY()) delta = (curMouseCoord[0] - self.initialMouseCoord[0], curMouseCoord[1] - self.initialMouseCoord[1]) xQuat = Quat() xQuat.setFromAxisAngle(delta[0] * self.SCALE, Vec3(0,0,1)) yQuat = Quat() yQuat.setFromAxisAngle(delta[1] * self.SCALE * -1, Vec3(1,0,0)) self.node.setQuat(base.cam, self.initialQuat * xQuat * yQuat) return Task.cont
def moveCamera( self, task ): is_down = base.mouseWatcherNode.is_button_down if base.mouseWatcherNode.hasMouse(): x = base.mouseWatcherNode.getMouseX() y = base.mouseWatcherNode.getMouseY() if is_down( MouseButton.two() ): dx = self.lastMousePos[0] - x self.ang -= dx #self.ang = max( 0, min( self.ang, math.pi*0.49 ) ) dy = self.lastMousePos[1] - y self.angY -= dy self.angY = max( 0.01, min( self.angY, math.pi ) ) self.lastMousePos = (x,y) speed = self.speed if is_down( self.bSpeed ): speed = speed*3 if self.attachmentNode and self.attached: self.focusPoint = self.attachmentNode.getPos() else: sideways = (is_down(self.bRight)-is_down(self.bLeft))*speed forward = (is_down(self.bForward)-is_down(self.bBackward))*speed quat = Quat() quat.setFromAxisAngle( -180*self.ang/math.pi, LVector3f.unitZ()) rotated = quat.xform( LVector3f( -forward, sideways, 0 )) self.focusPoint += rotated self.focusNode.setPos( self.focusPoint ) radius = self.zoom self.angY = max( 0, min( math.pi*0.4, self.angY ) ) rY = math.sin( self.angY ) self.nodePos = self.focusPoint + LVector3f( rY*math.cos(self.ang)*radius, -rY*math.sin(self.ang)*radius, radius*math.cos( self.angY) ) self.node.setPos( self.nodePos ) self.node.lookAt( self.focusNode, LVector3f.unitZ() ) return Task.cont
def moveCamera(self, task): is_down = base.mouseWatcherNode.is_button_down if base.mouseWatcherNode.hasMouse(): x = base.mouseWatcherNode.getMouseX() y = base.mouseWatcherNode.getMouseY() if is_down(MouseButton.two()): dx = self.lastMousePos[0] - x self.heading += dx * 25 #self.ang = max( 0, min( self.ang, math.pi*0.49 ) ) dy = self.lastMousePos[1] - y self.pitch -= dy * 25 self.pitch = max(self.pitch, -80) self.pitch = min(self.pitch, 80) #self.angY = max( 0.01, min( self.angY, math.pi ) ) self.lastMousePos = (x, y) speed = self.speed if is_down(self.bSpeed): speed = speed * 3 if not self.attached: forward = (is_down(self.bRight) - is_down(self.bLeft)) * speed sideways = -(is_down(self.bForward) - is_down(self.bBackward)) * speed quat = Quat() quat.setFromAxisAngle(self.heading, LVector3f.unitZ()) rotated = quat.xform(LVector3f(-forward, sideways, 0)) self.headingNode.setPos(self.headingNode.getPos() - rotated) #self.angY = max( 0, min( math.pi*0.4, self.angY ) ) #rY = math.sin( self.angY ) #self.nodePos = self.focusPoint + LVector3f( math.sin(self.angY)*math.cos(self.ang)*radius, -math.sin(self.ang)*radius, radius*math.cos( self.angY) ) self.node.lookAt(self.headingNode) self.node.setPos(0, -self.zoom, 0) self.pitchNode.setHpr(0, self.pitch, 0) self.headingNode.setHpr(self.heading, 0, 0) return Task.cont
def turnTowards(self, target, turnRate, dt): if isinstance(target, NodePath): target = target.getPos(Common.framework.showBase.render) elif isinstance(target, GameObject): target = target.root.getPos(Common.framework.showBase.render) diff = target - self.root.getPos(Common.framework.showBase.render) selfQuat = self.root.getQuat(Common.framework.showBase.render) selfForward = selfQuat.getForward() axis = selfForward.cross(diff.normalized()) axis.normalize() if axis.lengthSquared() < 0.1: return angle = selfForward.signedAngleDeg(diff.normalized(), axis) quat = Quat() angle = math.copysign(min(abs(angle), turnRate * dt), angle) quat.setFromAxisAngle(angle, axis) newQuat = selfQuat * quat self.root.setQuat(Common.framework.showBase.render, newQuat)
def update(self, keys, dt): GameObject.update(self, dt) self.updateSpeedometer() self.walking = False quat = self.root.getQuat(Common.framework.showBase.render) forward = quat.getForward() right = quat.getRight() up = quat.getUp() if keys["up"]: self.walking = True self.velocity += forward * self.acceleration * dt if keys["down"]: self.walking = True self.velocity -= forward * self.acceleration * dt if keys["left"]: self.walking = True self.velocity -= right * self.acceleration * dt if keys["right"]: self.walking = True self.velocity += right * self.acceleration * dt if self.walking: self.inControl = True mouseWatcher = base.mouseWatcherNode if mouseWatcher.hasMouse(): xSize = base.win.getXSize() ySize = base.win.getYSize() xPix = float(xSize % 2) / xSize yPix = float(ySize % 2) / ySize mousePos = Vec2(base.mouseWatcherNode.getMouse()) mousePos.addX(-xPix) mousePos.addY(-yPix) if abs(mousePos.x) < xPix: mousePos.x = 0 if abs(mousePos.y) < yPix: mousePos.y = 0 else: mousePos = self.lastMousePos if mousePos.length() > 0.01: axis = right * (mousePos.y) + up * (-mousePos.x) axis.normalize() angle = mousePos.length() * self.turnRate * dt rotQuat = Quat() rotQuat.setFromAxisAngle(angle, axis) self.root.setQuat(quat * rotQuat) if not self.weaponSets[0][0].active: self.alterEnergy( math.sin(1.071 * self.energy / self.maxEnergy + 0.5) * self.energyRechargeRate * dt) self.updateEnergyUI() self.updateHealthUI() self.updateRadar() #self.root.setH(self.root.getH() - mousePos.x*self.mouseSpeedHori*self.mouseSensitivity) #self.actor.setP(self.actor.getP() + mousePos.y*self.mouseSpeedVert*self.mouseSensitivity) if keys["shoot"]: self.startFiringSet(0) else: self.ceaseFiringSet(0) if keys["shootSecondary"]: self.startFiringSet(self.missileSetIndex + 1) else: for i in range(self.numMissileSets): self.ceaseFiringSet(i + 1) [effect.update(self, dt) for effect in self.updatingEffects] [ effect.cleanup() for effect in self.updatingEffects if not effect.active ] self.updatingEffects = [ effect for effect in self.updatingEffects if effect.active ] if self.targetingQueue.getNumEntries() > 0: self.targetingQueue.sortEntries() entry = self.targetingQueue.getEntry(0) intoNP = entry.getIntoNodePath() if intoNP.hasPythonTag(TAG_OWNER): other = intoNP.getPythonTag(TAG_OWNER) if other is self.prospectiveLockTarget and other is not self.lockedTarget: self.lockTargetTimer += dt if self.lockTargetTimer >= self.lockDuration: self.lockedTarget = other else: self.lockTargetTimer = 0 self.prospectiveLockTarget = other else: self.lockTargetTimer = 0 else: self.lockTargetTimer = 0 perc = self.lockTargetTimer / self.lockDuration self.lockBar.setTexOffset(TextureStage.getDefault(), 0, -perc * 1.1) if self.lockedTarget is not None: if self.lockedTarget.health <= 0: self.lockedTarget = None else: relPos = self.lockedTarget.root.getPos(self.root) planarVec = relPos.getXz() relDist = relPos.length() if relDist == 0: angle = 0 else: angle = math.acos(relPos.y / relDist) if relDist > 200 or angle > 1.7453: self.lockedTarget = None else: if self.lockMarkerRoot.isHidden(): self.lockMarkerRoot.show() camPt = Point2() convertedPt = Common.framework.showBase.cam.getRelativePoint( Common.framework.showBase.render, self.lockedTarget.root.getPos( Common.framework.showBase.render)) if Common.framework.showBase.camLens.project( convertedPt, camPt): self.lockMarkerRoot.setPos( Common.framework.showBase.render2d, camPt.x, 0, camPt.y) if self.lockMarkerRoot.isHidden(): self.lockMarkerRoot.show() for child in self.lockMarkerRoot.getChildren(): child.getChild(0).setZ( (1.0 - min(1, relDist / 100)) * 5 + 0.2) elif not self.lockMarkerRoot.isHidden(): self.lockMarkerRoot.hide() if relPos.y < 0 or angle > 0.6: planarVec.normalize() self.directionIndicator.setPos(planarVec.x * 0.4, 0, planarVec.y * 0.4) angle = math.degrees( math.atan2(planarVec.x, planarVec.y)) self.directionIndicator.setR(angle) if self.directionIndicator.isHidden(): self.directionIndicator.show() elif not self.directionIndicator.isHidden(): self.directionIndicator.hide() else: if not self.directionIndicator.isHidden(): self.directionIndicator.hide() if not self.lockMarkerRoot.isHidden(): self.lockMarkerRoot.hide()
def generate_roads(models, terrain, map, json_out): numroads = 0 for center in progress.bar(map.centers.values(), label='Generating roads... '): road_edges = [ e for e in center.edges if e.is_road and e.corner0 is not None and e.corner1 is not None ] if len(road_edges) != 2: continue e1, e2 = road_edges e1_0 = numpy.array( [e1.corner0.x, e1.corner0.y, e1.corner0.elevation * Z_SCALE], dtype=numpy.float32) e1_1 = numpy.array( [e1.corner1.x, e1.corner1.y, e1.corner1.elevation * Z_SCALE], dtype=numpy.float32) e2_0 = numpy.array( [e2.corner0.x, e2.corner0.y, e2.corner0.elevation * Z_SCALE], dtype=numpy.float32) e2_1 = numpy.array( [e2.corner1.x, e2.corner1.y, e2.corner1.elevation * Z_SCALE], dtype=numpy.float32) region_center = numpy.array( [center.x, center.y, center.elevation * Z_SCALE]) for end1, edge1, edge2 in [(region_center, e1_0, e1_1), (region_center, e2_0, e2_1)]: end2 = v3mid(edge1, edge2) midpt = v3mid(end1, end2) midpt = scene.mapgen_coords_to_sirikata(midpt, terrain) kata_pt1 = scene.mapgen_coords_to_sirikata(end1, terrain) kata_pt2 = scene.mapgen_coords_to_sirikata(end2, terrain) scale = v3dist(kata_pt1, kata_pt2) / 2 m = scene.SceneModel(ROAD_PATH, x=float(midpt[0]), y=float(midpt[1]), z=float(midpt[2]), scale=scale, model_type='road') kataboundmin, kataboundmax = scene.sirikata_bounds(m.boundsInfo) scenemin = kataboundmin * scale + midpt scenemax = kataboundmax * scale + midpt xmid = (scenemax[0] - scenemin[0]) / 2.0 + scenemin[0] road_edge1 = numpy.array([xmid, scenemin[1], scenemin[2]], dtype=numpy.float32) road_edge2 = numpy.array([xmid, scenemax[1], scenemin[2]], dtype=numpy.float32) midv3 = Vec3(midpt[0], midpt[1], midpt[2]) src = Vec3(road_edge2[0], road_edge2[1], road_edge2[2]) src -= midv3 src_copy = Vec3(src) target = Vec3(kata_pt1[0], kata_pt1[1], kata_pt1[2]) target -= midv3 cross = src.cross(target) w = math.sqrt( src.lengthSquared() * target.lengthSquared()) + src.dot(target) q = Quat(w, cross) q.normalize() orig_up = q.getUp() orig_up.normalize() edge1_kata = scene.mapgen_coords_to_sirikata(edge1, terrain) edge2_kata = scene.mapgen_coords_to_sirikata(edge2, terrain) new_up = normal_vector(kata_pt1, edge1_kata, edge2_kata) new_up = Vec3(new_up[0], new_up[1], new_up[2]) rotate_about = orig_up.cross(new_up) rotate_about.normalize() angle_between = orig_up.angleDeg(new_up) r = Quat() r.setFromAxisAngle(angle_between, rotate_about) r.normalize() q *= r q.normalize() m.orient_x = q.getI() m.orient_y = q.getJ() m.orient_z = q.getK() m.orient_w = q.getR() numroads += 1 json_out.append(m.to_json()) print 'Generated (%d) road objects' % numroads
def generate_roads(models, terrain, map, json_out): numroads = 0 for center in progress.bar(map.centers.values(), label='Generating roads... '): road_edges = [e for e in center.edges if e.is_road and e.corner0 is not None and e.corner1 is not None] if len(road_edges) != 2: continue e1, e2 = road_edges e1_0 = numpy.array([e1.corner0.x, e1.corner0.y, e1.corner0.elevation * Z_SCALE], dtype=numpy.float32) e1_1 = numpy.array([e1.corner1.x, e1.corner1.y, e1.corner1.elevation * Z_SCALE], dtype=numpy.float32) e2_0 = numpy.array([e2.corner0.x, e2.corner0.y, e2.corner0.elevation * Z_SCALE], dtype=numpy.float32) e2_1 = numpy.array([e2.corner1.x, e2.corner1.y, e2.corner1.elevation * Z_SCALE], dtype=numpy.float32) region_center = numpy.array([center.x, center.y, center.elevation * Z_SCALE]) for end1, edge1, edge2 in [(region_center, e1_0, e1_1), (region_center, e2_0, e2_1)]: end2 = v3mid(edge1, edge2) midpt = v3mid(end1, end2) midpt = scene.mapgen_coords_to_sirikata(midpt, terrain) kata_pt1 = scene.mapgen_coords_to_sirikata(end1, terrain) kata_pt2 = scene.mapgen_coords_to_sirikata(end2, terrain) scale = v3dist(kata_pt1, kata_pt2) / 2 m = scene.SceneModel(ROAD_PATH, x=float(midpt[0]), y=float(midpt[1]), z=float(midpt[2]), scale=scale, model_type='road') kataboundmin, kataboundmax = scene.sirikata_bounds(m.boundsInfo) scenemin = kataboundmin * scale + midpt scenemax = kataboundmax * scale + midpt xmid = (scenemax[0] - scenemin[0]) / 2.0 + scenemin[0] road_edge1 = numpy.array([xmid, scenemin[1], scenemin[2]], dtype=numpy.float32) road_edge2 = numpy.array([xmid, scenemax[1], scenemin[2]], dtype=numpy.float32) midv3 = Vec3(midpt[0], midpt[1], midpt[2]) src = Vec3(road_edge2[0], road_edge2[1], road_edge2[2]) src -= midv3 src_copy = Vec3(src) target = Vec3(kata_pt1[0], kata_pt1[1], kata_pt1[2]) target -= midv3 cross = src.cross(target) w = math.sqrt(src.lengthSquared() * target.lengthSquared()) + src.dot(target) q = Quat(w, cross) q.normalize() orig_up = q.getUp() orig_up.normalize() edge1_kata = scene.mapgen_coords_to_sirikata(edge1, terrain) edge2_kata = scene.mapgen_coords_to_sirikata(edge2, terrain) new_up = normal_vector(kata_pt1, edge1_kata, edge2_kata) new_up = Vec3(new_up[0], new_up[1], new_up[2]) rotate_about = orig_up.cross(new_up) rotate_about.normalize() angle_between = orig_up.angleDeg(new_up) r = Quat() r.setFromAxisAngle(angle_between, rotate_about) r.normalize() q *= r q.normalize() m.orient_x = q.getI() m.orient_y = q.getJ() m.orient_z = q.getK() m.orient_w = q.getR() numroads += 1 json_out.append(m.to_json()) print 'Generated (%d) road objects' % numroads
def mode0(self): #THIRD PERSON CAMERA COLLISION # print("thirdpersonnode") # print(self.playerBase.getHpr()) # print("pb") # print(self.character.getHpr()) deltaTime = globalClock.getDt() self.movingZ = False self.movingX = False self.walkConstant = 25 self.rotateConstant = 750 # Keyboard controls # LEVITATION STUFF (FORMERLY CALLED JETPACK) if self.keyMap["space"] and self.jetPack_energy > 0: jetpack = 0.00001 * (( (self.playerHolder.getZ()) - self.maximumHeight)**2) + 9.81 self.playerHolder.setZ(self.playerBase, jetpack) self.jetPack_energy -= 15 * deltaTime self.walkConstant = 70 self.jetPack_AUDIO.play() else: self.jetPack_AUDIO.stop() if self.jetPack_energy < 100: self.jetPack_energy += 10 * deltaTime if self.jetPack_energy > 100: self.jetPack_energy = 100 self.HUD.jetpackStatus.text = "Levitation Battery: " + str( int(self.jetPack_energy)) + "%" if (self.keyMap["forward"] or self.keyMap["backwards"]) and (self.keyMap["right"] or self.keyMap["left"]): self.walkConstant = int(((self.walkConstant**2) / 2)**0.5) # WASD MOVEMENT if self.keyMap["forward"]: self.monitor.setH(self.playerBase.getH() - 90) self.movingZ = True self.z_velocity += 5 if self.z_velocity > self.walkConstant: self.z_velocity = self.walkConstant if self.keyMap["right"]: self.monitor.setH(self.playerBase.getH() - 180) self.movingX = True self.x_velocity += 5 if self.x_velocity > self.walkConstant: self.x_velocity = self.walkConstant if self.keyMap["p"]: print(self.playerHolder.getPos()) print(self.thirdPersonCamera_ZOOM) self.gameMode = self.mode1 if self.keyMap["left"]: self.monitor.setH(self.playerBase.getH()) self.movingX = True self.x_velocity -= 5 if self.x_velocity < -self.walkConstant: self.x_velocity = -self.walkConstant if self.keyMap["backwards"]: self.monitor.setH(self.playerBase.getH() + 90) self.movingZ = True self.z_velocity -= 20 if self.z_velocity < -self.walkConstant: self.z_velocity = -self.walkConstant if self.movingZ == False: if self.z_velocity <= 7 or ( self.z_velocity >= -5 and self.z_velocity < 0): # Shaking bug fix self.z_velocity = 0 if self.z_velocity > 0: self.z_velocity -= 10 elif self.z_velocity < 0: self.z_velocity += 10 if self.movingX == False: if self.x_velocity <= 5 or ( self.x_velocity >= -5 and self.x_velocity < 0): # Shaking bug fix self.x_velocity = 0 if self.x_velocity > 0: self.x_velocity -= 10 elif self.x_velocity < 0: self.x_velocity += 10 # MONITOR HEADINGS FOR DOUBLE INPUT if self.keyMap["forward"] and self.keyMap["right"]: self.monitor.setH(self.playerBase.getH() - 135) elif self.keyMap["forward"] and self.keyMap["left"]: self.monitor.setH(self.playerBase.getH() - 45) elif self.keyMap["backwards"] and self.keyMap["left"]: self.monitor.setH(self.playerBase.getH() + 45) elif self.keyMap["backwards"] and self.keyMap["right"]: self.monitor.setH(self.playerBase.getH() + 135) # third person camera control if (self.toggleFPCam == False): # third person camera controls if (base.mouseWatcherNode.hasMouse() == True): mouseposition = base.mouseWatcherNode.getMouse() self.thirdPersonNode.setP(mouseposition.getY() * 30) self.playerBase.setH(mouseposition.getX() * -50) if (mouseposition.getX() < 0.1 and mouseposition.getX() > -0.1): self.playerBase.setH(self.playerBase.getH()) if self.thirdPersonNode.getP() > 90: self.recenterMouse() self.thirdPersonNode.setP(90) # TRACK MOUSE elif self.thirdPersonNode.getP() < -90: self.recenterMouse() self.thirdPersonNode.setP(-90) if self.thirdPersonCamera_ZOOM > -20: # validate zoom self.thirdPersonCamera_ZOOM = -20 elif self.thirdPersonCamera_ZOOM < -390: self.thirdPersonCamera_ZOOM = -390 # CAMERA STUFF # FIRST PERSON CAMERA if self.toggleFPCam: # first person camera controls camera.setPos(self.character.getPos()) # 0,-50,-10 camera.setZ(camera.getZ() + 6) self.playerHolder.hide() if (base.mouseWatcherNode.hasMouse() == True): mouseposition = base.mouseWatcherNode.getMouse() camera.setP(mouseposition.getY() * 20) self.playerBase.setH(mouseposition.getX() * -50) if (mouseposition.getX() < 0.1 and mouseposition.getX() > -0.1): self.playerBase.setH(self.playerBase.getH()) if camera.getP() > 90: self.recenterMouse() camera.setP(90) # TRACK MOUSE elif camera.getP() < -90: self.recenterMouse() camera.setP(-90) else: # takes out of first person perspective if toggleFPS is turned off. self.playerHolder.show() camera.setPos(0, self.thirdPersonCamera_ZOOM, 0) # 0,-50,-4 camera.lookAt(self.character) # movement updates self.playerHolder.setY(self.playerBase, (self.z_velocity * deltaTime)) self.playerHolder.setX(self.playerBase, (self.x_velocity * deltaTime)) # forward/backward rolling axis = self.playerBase.getQuat().getRight() angle = (self.z_velocity * deltaTime * -8) quat = Quat() quat.setFromAxisAngle(angle, axis) newVec = self.character.getQuat() * quat # print(newVec.getHpr()) self.character.setQuat(newVec) # sideways rolling axis = self.playerBase.getQuat().getForward() angle = (self.x_velocity * deltaTime * 8) quat = Quat() quat.setFromAxisAngle(angle, axis) newVec = self.character.getQuat() * quat # print(self.playerBase.getPos()) self.character.setQuat(newVec) self.cameraRay.setPointA(self.playerBase.getPos()) if camera.getPos() != (0, 0, 0): self.cameraRay.setPointB(camera.getPos(base.render)) self.cTrav.traverse(render) # checking for camera collisions entries = list(self.cameraCollisionHandler.entries) for entry in entries: if str(entry.getIntoNodePath())[:19] != "render/worldTerrain": #camera.setPos(entry.getSurfacePoint(self.thirdPersonNode)) self.thirdPersonCamera_ZOOM += 1 # if len(entries) > 0: # if (self.playerHolder.getZ() < entries[-1].getSurfacePoint(render).getZ() + 8): # self.playerHolder.setZ(entries[-1].getSurfacePoint(render).getZ() + 8) # self.vertical_velocity = 0 # checking for collisions - downwards entries = list(self.groundHandler.entries) entries.sort(key=lambda x: x.getSurfacePoint(render).getZ()) self.performGravity = True if self.performGravity == True: self.vertical_velocity -= (deltaTime * 9.81) if self.vertical_velocity <= -15: self.vertical_velocity = -15 self.playerHolder.setPos(self.playerHolder, Vec3(0, 0, self.vertical_velocity)) # Gravity if len(entries) > 0: if (self.playerHolder.getZ() < entries[-1].getSurfacePoint(render).getZ() + 8): self.playerHolder.setZ( entries[-1].getSurfacePoint(render).getZ() + 8) self.vertical_velocity = 0 # checking for collisions - upwards entries = list(self.upwardsHandler.entries) entries.sort(key=lambda x: x.getSurfacePoint(render).getZ()) if len(entries) > 0: for entry in entries: if (self.playerHolder.getZ() > entry.getSurfacePoint(render).getZ() - 70): self.playerHolder.setZ( entry.getSurfacePoint(render).getZ() - 130)