def SetupBulletTerrain(self): self.worldNP = self.render.attachNewNode('World') self.world = BulletWorld() self.world.setGravity(Vec3(0, 0, -9.81)) img = PNMImage(Filename(self.PngDEM)) if self.MeterScale < 1.1: shape = BulletHeightfieldShape(img, self.HeightRange, ZUp) else: shape = BulletHeightfieldShape(img, self.HeightRange, ZUp) shape.setUseDiamondSubdivision(True) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Heightfield')) np.node().addShape(shape) offset = self.MeterScale * self.PixelNr / 2.0 np.setPos(+offset, +offset, +(self.HeightRange / 2.0) + self.OffsetHeight) np.setSx(self.MeterScale) np.setSy(self.MeterScale) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node())
def terrainFromHeightMap(self, main): self.parentNodePath = NodePath("FloorNodePath") self.parentNodePath.setPos(0, 0, -2) self.parentNodePath.setScale(5, 5, 0.75) # Heightfield (static) height = 8.0 img = PNMImage(Filename('models/elevation.png')) xdim = img.getXSize() ydim = img.getYSize() shape = BulletHeightfieldShape(img, height, ZUp) shape.setUseDiamondSubdivision(True) self.rigidNode = BulletRigidBodyNode('Heightfield') self.rigidNode.notifyCollisions(False) self.rigidNodePath = self.parentNodePath.attachNewNode(self.rigidNode) self.rigidNodePath.node().addShape(shape) self.rigidNodePath.setPos(0, 0, 0) self.rigidNodePath.setCollideMask(BitMask32.allOn()) self.rigidNodePath.node().notifyCollisions(False) main.world.attachRigidBody(self.rigidNodePath.node()) self.hf = self.rigidNodePath.node() # To enable/disable debug visualisation self.terrain = GeoMipTerrain('terrain') self.terrain.setHeightfield(img) self.terrain.setBlockSize(32) self.terrain.setNear(50) self.terrain.setFar(100) self.terrain.setFocalPoint(base.camera) rootNP = self.terrain.getRoot() rootNP.reparentTo(self.parentNodePath) rootNP.setSz(8.0) offset = img.getXSize() / 2.0 - 0.5 rootNP.setPos(-offset, -offset, -height / 2.0) self.terrain.generate() # Apply texture diffuseTexture = loader.loadTexture(Filename('models/diffuseMap.jpg')) diffuseTexture.setWrapU(Texture.WMRepeat) diffuseTexture.setWrapV(Texture.WMRepeat) rootNP.setTexture(diffuseTexture) # Normal map texStage = TextureStage('texStageNormal') texStage.setMode(TextureStage.MNormal) normalTexture = loader.loadTexture(Filename('models/normalMap.jpg')) rootNP.setTexture(texStage, normalTexture) # Glow map texStage = TextureStage('texStageNormal') texStage.setMode(TextureStage.MGlow) glowTexture = loader.loadTexture(Filename('models/glowMap.jpg')) rootNP.setTexture(texStage, glowTexture)
def createGround(self, terrainData): """Create ground using a heightmap""" # Create heightfield for physics heightRange = terrainData["heightRange"] # Image needs to have dimensions that are a power of 2 + 1 heightMap = PNMImage(self.basePath + terrainData["elevation"]) xdim = heightMap.getXSize() ydim = heightMap.getYSize() shape = BulletHeightfieldShape(heightMap, heightRange, ZUp) shape.setUseDiamondSubdivision(True) np = self.outsideWorldRender.attachNewNode(BulletRigidBodyNode("terrain")) np.node().addShape(shape) np.setPos(0, 0, 0) self.physicsWorld.attachRigidBody(np.node()) # Create graphical terrain from same height map terrain = GeoMipTerrain("terrain") terrain.setHeightfield(heightMap) terrain.setBlockSize(32) terrain.setBruteforce(True) rootNP = terrain.getRoot() rootNP.reparentTo(self.worldRender) rootNP.setSz(heightRange) offset = xdim / 2.0 - 0.5 rootNP.setPos(-offset, -offset, -heightRange / 2.0) terrain.generate() # Apply texture diffuse = self.loader.loadTexture(Filename(self.basePath + terrainData["texture"])) diffuse.setWrapU(Texture.WMRepeat) diffuse.setWrapV(Texture.WMRepeat) rootNP.setTexture(diffuse) textureSize = 6.0 ts = TextureStage.getDefault() rootNP.setTexScale(ts, xdim / textureSize, ydim / textureSize) # Create planes around area to prevent player flying off the edge # Levels can define barriers around them but it's probably a good # idea to leave this here just in case sides = ( (Vec3(1, 0, 0), -xdim / 2.0), (Vec3(-1, 0, 0), -xdim / 2.0), (Vec3(0, 1, 0), -ydim / 2.0), (Vec3(0, -1, 0), -ydim / 2.0), ) for sideNum, side in enumerate(sides): normal, offset = side sideShape = BulletPlaneShape(normal, offset) sideNode = BulletRigidBodyNode("side%d" % sideNum) sideNode.addShape(sideShape) self.physicsWorld.attachRigidBody(sideNode)
def patch_done(self, patch): heightmap_patch = patch.owner.heightmap.get_heightmap(patch) shape = BulletHeightfieldShape(heightmap_patch.texture, patch.owner.heightmap.height_scale, ZUp) shape.setUseDiamondSubdivision(True) self.instance = NodePath(BulletRigidBodyNode('Heightfield')) self.instance.node().add_shape(shape) x = (heightmap_patch.x0 + heightmap_patch.x1) / 2.0 y = (heightmap_patch.y0 + heightmap_patch.y1) / 2.0 z = patch.owner.heightmap.height_scale / 2 size = heightmap_patch.x1 - heightmap_patch.x0 self.instance.set_pos(x, y, z) self.instance.set_scale(size / heightmap_patch.width, size / heightmap_patch.height, 1.0) self.instance.setCollideMask(BitMask32.allOn()) self.physics.add(self.instance)
def setupPhysics(self, **kwargs): self.barn = sceneModel( modelName='models/environmentModels/sceneModels/New folder.egg', world=kwargs['world'], dynamic=False) self.modelList.append(self.barn) self.barn.model.setScale(.14) self.barn.nodePath.setPos(8, -5, -1.2) self.barn.nodePath.setScale(.4) self.barn.model.setZ(self.barn.nodePath.getZ()) self.mainNp = kwargs['world'].attachNewNode( BulletRigidBodyNode('Heightfield')) self.debugNP = kwargs['world'].attachNewNode(BulletDebugNode('Debug')) self.crate = sceneModel( modelName='models/environmentModels/sceneModels/crate.egg', world=kwargs['world'], dynamic=True) self.crate.nodePath.setScale(.06) self.modelList.append(self.crate) self.crate.nodePath.setPos(self.barn.nodePath, (-4, -3, -.9)) self.crate.model.setPos(self.crate.nodePath, (15.8, 5.6, -1.9)) self.crate.model.setScale(1.2) self.debugNP.show() self.debugNP.node().showNormals(True) height = 10.0 skytexture = loader.loadTexture( 'models/environmentModels/sceneModels/sky/tex/skydome.png') self.sky.setTexture(skytexture) self.sky.reparentTo(kwargs['world']) img = PNMImage( Filename( 'models/environmentModels/eartharena/tex/terrainHeight.png')) shape = BulletHeightfieldShape(img, height, ZUp) shape.setUseDiamondSubdivision(True) self.mainNp.node().addShape(shape) self.mainNp.setPos(0, 0, .01) self.mainNp.setScale(.340) self.mainNp.setCollideMask(kwargs['mask']) self.terrain.setHeightfield( Filename( 'models/environmentModels/eartharena/tex/terrainHeight.png')) self.terrain.setBlockSize(64) self.terrain.setNear(50) self.terrain.setFar(100) self.terrain.setFocalPoint(base.camera) rootNp = self.terrain.getRoot() rootNp.reparentTo(render) rootNp.setSz(15) texture = loader.loadTexture( 'models/environmentModels/eartharena/tex/nova_TX.jpg') rootNp.setTexture(texture) offset = img.getXSize() / 2.0 - 0.25 rootNp.setPos(-offset, -offset, -height / 2.0) self.terrain.generate()
def setup(self): self.worldNP = render.attachNewNode('World') # World self.world = BulletWorld() self.world.setGravity(Vec3(0, 0, -9.81)) #height map # Filename: # small -> 'Maps/HeightMapSmall.png' # big -> 'Maps/HeightMapBig.png' img = PNMImage(Filename('Maps/HeightMapSmall.png')) shape = BulletHeightfieldShape(img, self.height, ZUp) shape.setUseDiamondSubdivision(True) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Heightfield')) np.node().addShape(shape) np.setPos(0, 0, 0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) #adding Texture #setColorMap: #small -> 'Maps/TextureMapSmall.jpg' #big -> 'Maps/TextureMapBig.jpg' self.terrain = GeoMipTerrain('terrain') self.terrain.setHeightfield(img) self.terrain.setColorMap('Maps/TextureMapSmall.jpg') self.terrain.setBruteforce(True) # level of detail self.terrain.setBlockSize(32) self.terrain.setNear(50) self.terrain.setFar(100) self.terrain.setFocalPoint(base.camera) rootNP = self.terrain.getRoot() rootNP.reparentTo(render) rootNP.setSz(self.height) offset = img.getXSize() / 2.0 - 0.5 rootNP.setPos(-offset, -offset, -self.height / 2.0) self.makeMapBorders(offset) self.terrain.generate() # creating vehicles #controlled vehicles self.controlVehicles = [] self.controlVehicles.append( Vehicle(0, 00, 40, "B", self.worldNP, self.world)) #vehicles goint to a specific point #self.squareVeh = Vehicle(0, 50, 40, "G", self.worldNP, self.world) #thread.start_new_thread(self.goSquare, (self.squareVeh, 100)) #vehicles following user #self.followVehicles = [] #self.followVehicles.append(Vehicle(-offset+10, -offset+10, 40, "R", self.worldNP, self.world)) #self.followVehicles.append(Vehicle(offset-10, offset-10, 60, "R", self.worldNP, self.world)) #for veh in self.followVehicles: # thread.start_new_thread(follow, (veh, self.controlVehicles[0])) #vehicles for hill climbing self.hillVehicles = [] self.hillVehicles.append( Vehicle(-offset + 10, -offset + 10, 40, "R", self.worldNP, self.world)) self.hillVehicles.append( Vehicle(offset - 10, offset - 10, 60, "R", self.worldNP, self.world)) for veh in self.hillVehicles: thread.start_new_thread(blindClimb, (veh, ))