saw this post: [url]fade from one camera to another?]
And it gave me a good idea on how to fade from one camera perspective to another, and so I wrote a small script (mostly a function) that will do this for you, it’s pretty simply and has a really pleasing effect.
EDIT (script updated): Fixed the clear color of the buffer so that the previous scene never shows through
Here it is (No models / textures required for it):
#- Start panda import direct.directbase.DirectStart #- Basic imports needed for this function from direct.interval.IntervalGlobal import * from panda3d.core import Point3, Vec3, CardMaker #- Display a model, load your scene, idk panda = loader.loadModel('environment') panda.reparentTo(render) #- Disable mouse driven camera, so that calls to camera.setPos, etc work base.disableMouse() #- Our fadeCamera function, this fades the currently viewed scene to a new camera perspective #- over a period of (fadeInDuration) seconds def fadeCamera(pos, rot, fadeInDuration = 1.0): #- Create a new live texture buffer that will render the new camera perspective each frame #- while we are fading the new camera perspective into full view buffer2 = base.win.makeTextureBuffer('mybuffer', base.win.getXSize(), base.win.getYSize()) buffer2.setClearColorActive(True) #- Enable the clear color, so that the background color is shown col = base.getBackgroundColor() #- Get the current background color col = 1 #- Make 100% sure that the background color is solid (otherwise the previos scene will show through) buffer2.setClearColor(col) #- Set the clear color to it now #- Create a new camera, for the buffer, and position/rotate it to the new perspective cam2 = base.makeCamera(buffer2) cam2.reparentTo(render) cam2.setPos(pos) cam2.setHpr(rot) #- Create a fullscreen card for displaying the live scene (from the new camera perspective) cm = CardMaker('displayCard') cm.setFrame(-1, 1, -1, 1) cm.setUvRange(buffer2.getTexture()) #- Make sure we set the UV range properly! card = render2d.attachNewNode(cm.generate()) card.setTransparency(True) card.setTexture(buffer2.getTexture()) #- Here is where the magic happens #- First fade the card with the live scene texture in #- Then move the actual camera #- Then cleanup the temporary camera, the card for displaying the live scene, and the buffer #- Perform all of these in order, using a Sequence fadeCardIn = card.colorScaleInterval(fadeInDuration, 1, 0) moveActualCamera = Func(camera.setPosHpr, render, cam2.getPos(), cam2.getHpr()) cleanupCamera = Func(cam2.remove) cleanupCard = Func(card.remove) cleanupBuffer = Func(base.graphicsEngine.removeWindow, buffer2) Sequence(fadeCardIn, moveActualCamera, cleanupCard, cleanupCamera, cleanupBuffer).start() #- Place the camera at one perspective camera.setPosHpr(Point3(6.3, -45.9, 7.8), Vec3(0, 0, 0)) print 'Performing initial fade!' fadeCamera(Point3(99, -851, 150), Vec3(7, -10, 0)) #- Do our initial fade def doRandomFade(): #- Just get a random position / rotation for the new camera perspective #- This part is really un-important import random p = Point3(random.randrange(-900, 900), random.randrange(-900, 900), random.randrange(90, 190)) tmp = render.attachNewNode('tmp') tmp.setPos(p) tmp.lookAt(0, 0, 0) r = tmp.getHpr() tmp.remove() #- Actuall fade to the new position and rotation for the camera perspective fadeCamera(p, r) print 'Performing random fade!' #- Set it such that when the user presses space it goes to the new perspective base.accept('space', doRandomFade) run()
Hope this helps,