Excellent, thanks! I have update the code so I deleted the code above and the latest follows. One more question … I figured out how to set the background color of the display region but even when I give it an alpha of say 0.5 or so it is still fully opaque. Know how to make that viewport region semi-transparent?
Thanks again,
Paul
# Standard imports
import sys
import math
# Panda imports
from pandac.PandaModules import *
from direct.gui.OnscreenText import OnscreenText
from direct.showbase import DirectObject
from direct.showbase.DirectObject import DirectObject
import direct.directbase.DirectStart
from direct.task import Task
# Tweak stuff
CubeSpeed = 1
CubeRate = 22
BgColor = VBase4(0.0,0.1,0.55,1.0)
VPColor = VBase4(0.2,0.3,0.75,0.2)
VPRot = [32,24,36]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
class World(DirectObject):
# *** Create the alternate viewport and set it up to display a
# *** simple static axes and the dynamic (HPR only cube).
def createViewport(self):
# Create the root of our scene graph for the viewport
self.mVPRoot = NodePath("ViewportRoot")
# Add a simple 3D axes model to the scene graph
self.mCamAxes = CreateAxes('ViewportAxes',2)
self.mCamAxes.setScale(2,2,2)
self.mCamAxes.reparentTo(self.mVPRoot)
self.mCamAxes.setHpr(VPRot[0],VPRot[1],VPRot[2])
# Create the camera to render the viewport
self.mVPCamera = Camera("mVPCamera")
self.mVPCamera.setScene(self.mVPRoot)
self.mVPCameraNode = self.mVPRoot.attachNewNode(self.mVPCamera)
self.mVPCameraNode.setPos(0,-12,0)
self.mVPCameraNode.setHpr(0,0,0)
# Create the display region
self.mVPDisplayRegion = \
base.win.makeDisplayRegion(0.70,0.95,0.70,0.95)
self.mVPDisplayRegion.setClearColorActive(1)
self.mVPDisplayRegion.setClearDepthActive(1)
self.mVPDisplayRegion.setCamera(self.mVPCameraNode)
self.mVPDisplayRegion.setClearColor(VPColor)
self.mCube2 = CreateWireCube("Cube",1)
self.mCube2.setColor(1,1,0)
self.mCube2.setHpr(VPRot[0],VPRot[1],VPRot[2])
self.mCube2.reparentTo(self.mVPRoot)
# *** Constructor
def __init__(self):
base.setBackgroundColor(BgColor)
self.accept('escape',sys.exit)
# Setup the main 'world' scene
self.mWorld = NodePath("World")
self.mWorld.reparentTo(render)
self.mSceneSize = 12.0
self.mMainSceneAxes = CreateAxes('MainAxes',4)
self.mMainSceneAxes.setScale(\
self.mSceneSize,
self.mSceneSize,
self.mSceneSize
)
self.mMainSceneAxes.reparentTo(self.mWorld)
self.mCube = CreateWireCube("Cube",1)
self.mCube.setColor(1,1,0)
self.mCube.reparentTo(self.mWorld)
# Setup main camera
base.camLens.setFar(9000)
base.camLens.setFov(55)
base.cam.setPos(2*self.mSceneSize,-3*self.mSceneSize,self.mSceneSize)
base.cam.setHpr(30,-10,0)
# Setup the alternate viewport
self.createViewport()
# Setup time update task to control dynamics of cube.
taskMgr.add(self.timeUpdate,'TimeUpdate')
self.accept('arrow_up',self.up)
self.accept('arrow_up-repeat',self.up)
self.accept('arrow_down',self.down)
self.accept('arrow_down-repeat',self.down)
self.accept('arrow_left',self.left)
self.accept('arrow_left-repeat',self.left)
self.accept('arrow_right',self.right)
self.accept('arrow_right-repeat',self.right)
self.accept('+',self.lSpin)
self.accept('+-repeat',self.lSpin)
self.accept('-',self.rSpin)
self.accept('--repeat',self.rSpin)
def up(self):
VPRot[0] = VPRot[0] + 1
def down(self):
VPRot[0] = VPRot[0] - 1
def left(self):
VPRot[1] = VPRot[1] + 1
def right(self):
VPRot[1] = VPRot[1] - 1
def lSpin(self):
VPRot[2] = VPRot[2] + 1
def rSpin(self):
VPRot[2] = VPRot[2] - 1
# *** Time update task
def timeUpdate(self,task):
# *** Update the traveling cube dynamics
x = task.time*CubeSpeed
y = task.time*CubeSpeed
z = math.sin(task.time/5.0)
hpr = self.mCube.getHpr()
h = hpr[0]
p = r = task.time*CubeRate
self.mCube.setPos(x,y,z)
self.mCube.setHpr(h,p,r)
self.mCube2.setHpr(h+VPRot[0],p+VPRot[1],r+VPRot[2])
self.mCamAxes.setHpr(VPRot[0],VPRot[1],VPRot[2])
return Task.cont
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
def CreateWireCube(nodeName,lineThickness=1):
ls = LineSegs(nodeName)
ls.setThickness(lineThickness)
ls.moveTo(0.5,-0.5,-0.5)
ls.drawTo(0.5,0.5,-0.5)
ls.drawTo(0.5,0.5,0.5)
ls.drawTo(0.5,-0.5,0.5)
ls.drawTo(0.5,-0.5,-0.5)
ls.moveTo(-0.5,-0.5,-0.5)
ls.drawTo(-0.5,0.5,-0.5)
ls.drawTo(-0.5,0.5,0.5)
ls.drawTo(-0.5,-0.5,0.5)
ls.drawTo(-0.5,-0.5,-0.5)
ls.moveTo(0.5,0.5,-0.5)
ls.drawTo(-0.5,0.5,-0.5)
ls.moveTo(0.5,0.5,0.5)
ls.drawTo(-0.5,0.5,0.5)
ls.moveTo(0.5,-0.5,-0.5)
ls.drawTo(-0.5,-0.5,-0.5)
ls.moveTo(0.5,-0.5,0.5)
ls.drawTo(-0.5,-0.5,0.5)
return NodePath(ls.create())
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
def CreateAxes(nodeName,lineThickness=1):
ls = LineSegs(nodeName)
ls.setThickness(lineThickness)
ls.setColor(1.0, 0.0, 0.0, 1.0)
ls.moveTo(0.0, 0.0, 0.0)
ls.drawTo(1.0, 0.0, 0.0)
ls.setColor(0.0, 1.0, 0.0, 1.0)
ls.moveTo(0.0,0.0,0.0)
ls.drawTo(0.0, 1.0, 0.0)
ls.setColor(0.0, 0.0, 1.0, 1.0)
ls.moveTo(0.0,0.0,0.0)
ls.drawTo(0.0, 0.0, 1.0)
return NodePath(ls.create())
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
world = World()
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Run the program
run()