import sys from PyOSG import * from math import sin, cos class MyNodeCallback(osg.NodeCallback): def __init__(self): self.angle = 0 # void MyNodeCallback.operator()(osg.Node* n,osg.NodeVisitor* nv) # { # if(osgSim.SphereSegment* ss=dynamic_cast(n)) # { # osg.Vec3 vec # float azRange, elevRange # ss.getArea(vec,azRange,elevRange) # # float azRangeDeg = osg.RadiansToDegrees(azRange) # # static bool azAscending = false # # if(azAscending){ # azRangeDeg += 1.0 # if(azRangeDeg>89.0) azAscending = false # }else{ # azRangeDeg -= 1.0 # if(azRangeDeg<2.0) azAscending = true # } # # ss.setArea(vec,osg.DegreesToRadians(azRangeDeg),elevRange) # # } # traverse(n,nv) # } def apply(self, n, nv): ss = osgSim.asSphereSegment(n) if ss: vec, azRange, elevRange = ss.getArea() self.angle += 1 if self.angle > 359.0: self.angle = 0.0 vec.set(sin(osg.DegreesToRadians(angle)),cos(osg.DegreesToRadians(angle)),0.0) print "angle " + str(angle) + " degrees, vec is " + str(vec) +\ ", azRange is " + str(osg.RadiansToDegrees(azRange)) +\ ", elevRange is " + str(osg.RadiansToDegrees(elevRange)) ss.setArea(vec,azRange,elevRange) self.traverse(n,nv) def createSphereSegment(): ss = osgSim.SphereSegment(osg.Vec3(0.0,0.0,0.0), 1.0, osg.Vec3(0.0,1.0,0.0), osg.DegreesToRadians(90.0), osg.DegreesToRadians(45.0), 60) ss.setAllColors(osg.Vec4(1.0,1.0,1.0,0.5)) ss.setSideColor(osg.Vec4(0.0,0.0,1.0,0.5)) return ss def main(argv): # use an ArgumentParser object to manage the program arguments. arguments = osg.ArgumentParser(argv) # set up the usage document, in case we need to print out how to use this program. arguments.getApplicationUsage().setDescription(arguments.getApplicationName()+" is the example which demonstrates both text, animation and billboard via custom transform to create the OpenSceneGraph logo..") arguments.getApplicationUsage().setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...") arguments.getApplicationUsage().addCommandLineOption("-h or --help","Display this information") arguments.getApplicationUsage().addCommandLineOption("ps","Render the Professional Services logo") # construct the viewer. viewer = osgProducer.Viewer(arguments) # set up the value with sensible default event handlers. viewer.setUpViewer(osgProducer.Viewer.STANDARD_SETTINGS) # get details on keyboard and mouse bindings used by the viewer. viewer.getUsage(arguments.getApplicationUsage()) # if user request help write it out to cout. if arguments.read("-h") or arguments.read("--help"): arguments.getApplicationUsage().write() return 1 # any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized() # report any errors if they have occured when parsing the program aguments. if arguments.errors(): arguments.writeErrorMessages() return 1 node = createSphereSegment() # add model to viewer. viewer.setSceneData( node ) # create the windows and run the threads. viewer.realize() while not viewer.done(): # wait for all cull and draw threads to complete. viewer.sync() # update the scene by traversing it with the the update visitor which will # call all node update callbacks and animations. viewer.update() # fire off the cull and draw traversals of the scene. viewer.frame() # wait for all cull and draw threads to complete before exit. viewer.sync() return 0 if __name__ == "__main__": main(sys.argv)