def create_lights(self): # function for converting cylindrical coordinates to cartesian # coordinates rtz2xyz = lambda r, t, z: (r * np.cos(t), r * np.sin(t), z) # positions for point lights plight_pos = [ rtz2xyz(1.5, 4 * np.pi / 12., 0), rtz2xyz(1.5, 12 * np.pi / 12., 0), rtz2xyz(1.5, 20 * np.pi / 12., 0), (0, 0, 1.3), ] # create point lights self.plights = p3d.NodePath("plights") for i, pos in enumerate(plight_pos): plight = pm.PointLight('plight%d' % i) plight.setColor((0.5, 0.5, 0.5, 1.0)) plight.setAttenuation((0, 0, 0.5)) plnp = self.plights.attachNewNode(plight) plnp.setPos(pos) self.render.setLight(plnp) self.plights.reparentTo(self.lights) self.plights.setPos(0, 0, 4 / 3.) # update the position and color of the spotlight slnp = self.lights.find('slight') slnp.setPos((8, 6, 20)) slnp.lookAt(self.look_at) slnp.node().setColor((1, 1, 1, 1)) # update the color of the ambient light alnp = self.lights.find('alight') alnp.node().setColor((0.2, 0.2, 0.2, 1))
def __init__(self): """Initialise the test scene.""" # Show the framerate base.setFrameRateMeter(True) # Make 4 terrain nodepath objects with different hilliness values # and arrange them side-by-side in a 2x2 grid, giving a big terrain # with variable hilly and flat areas. color = (0.6, 0.8, 0.5, 1) # Bright green-ish scale = 12 t1 = Terrain(color=color, scale=scale, trees=0.7) t1.prime.reparentTo(render) t2 = Terrain(color=color, scale=scale, h=24, pos=P.Vec3(32 * scale, 0, 0), trees=0.5) t2.prime.reparentTo(render) t3 = Terrain(color=color, scale=scale, h=16, pos=P.Vec3(32 * scale, 32 * scale, 0), trees=0.3) t3.prime.reparentTo(render) t4 = Terrain(color=color, scale=scale, h=2, pos=P.Vec3(0, 32 * scale, 0), trees=0.9) t4.prime.reparentTo(render) # Setup a camera. base.disableMouse() self.camera = Camera(P.Vec3(0, 0, 100)) self.camera.lookAt(320, 320, 0) # Setup keyboard controls. # Accept some keys to move the camera. self.accept("a", self.camera.setControl, ["left", 1]) self.accept("a-up", self.camera.setControl, ["left", 0]) self.accept("d", self.camera.setControl, ["right", 1]) self.accept("d-up", self.camera.setControl, ["right", 0]) self.accept("w", self.camera.setControl, ["up", 1]) self.accept("w-up", self.camera.setControl, ["up", 0]) self.accept("s", self.camera.setControl, ["down", 1]) self.accept("s-up", self.camera.setControl, ["down", 0]) self.accept("arrow_up", self.camera.setControl, ["forward", 1]) self.accept("arrow_up-up", self.camera.setControl, ["forward", 0]) self.accept("arrow_down", self.camera.setControl, ["backward", 1]) self.accept("arrow_down-up", self.camera.setControl, ["backward", 0]) self.accept("arrow_left", self.camera.setControl, ["strafe-left", 1]) self.accept("arrow_left-up", self.camera.setControl, ["strafe-left", 0]) self.accept("arrow_right", self.camera.setControl, ["strafe-right", 1]) self.accept("arrow_right-up", self.camera.setControl, ["strafe-right", 0]) # Accept the Esc key to exit. self.accept("escape", sys.exit) # Setup lighting. self.alight = P.AmbientLight('alight') self.alight.setColor(P.VBase4(0.35, 0.35, 0.35, 1)) self.alnp = render.attachNewNode(self.alight) render.setLight(self.alnp) self.dlight = P.DirectionalLight('dlight') self.dlight.setColor(P.VBase4(0.4, 0.4, 0.4, 1)) self.dlnp = render.attachNewNode(self.dlight) self.dlnp.setHpr(45, -45, 0) render.setLight(self.dlnp) self.plight = P.PointLight('plight') self.plight.setColor(P.VBase4(0.8, 0.8, 0.5, 1)) self.plnp = render.attachNewNode(self.plight) self.plnp.setPos(160, 160, 50) self.slight = P.Spotlight('slight') self.slight.setColor(P.VBase4(1, 1, 1, 1)) lens = P.PerspectiveLens() self.slight.setLens(lens) self.slnp = render.attachNewNode(self.slight) self.slnp.setPos(-20, -20, 20) self.slnp.lookAt(50, 50, 0) # Setup some scene-wide exponential fog. colour = (0.5, 0.8, 0.8) self.expfog = P.Fog("Scene-wide exponential Fog object") self.expfog.setColor(*colour) self.expfog.setExpDensity(0.0005) render.setFog(self.expfog) base.setBackgroundColor(*colour)