View Full Version : Clearing the MainScene
miles
01-18-2011, 09:14 AM
Hello all,
I have recently joined an experimental research group using Vizard for submersing test subjects in a virtual environment. After becoming acquainted with Vizard and the existing code base, I am now working on improving features and fixing bugs.
One issue I can't quite seem to figure out is how to clear all objects from the scene. As it stands now, before each trial of the experiment is run, the environment is uniquely regenerated. However, the objects from previous trials persist trial to trial.
I need to find a way to clear the scene before it is regenerated. I have looked for a Vizard function that will do this with no avail. Any thoughts?
Thanks in advance
You could save each object you create in a global list. Then when you're ready to clear the scene use the <node3D>.remove command for each element in the list.
miles
01-18-2011, 12:23 PM
I see, but there's no built in function for either clearing the whole scene, or getting a list of objects in the scene? I've tried for node in viz.getNodeList(): node.remove(), but this seems to give unexpected results.
farshizzo
01-18-2011, 12:30 PM
Try using viz.MainScene.getChildren() to get all the nodes in the scene.
miles
01-18-2011, 12:58 PM
Thanks for the replies.
I've tried that too. I have the same unexpected results. For instance, running
viz.MainScene.getChildren()[0].remove()
in the console while it's running seems to mess up navigation.
Can you post some example code that shows the problem you're having?
miles
01-18-2011, 01:37 PM
Unfortunately, the project is many large files, so I can't post the whole thing. I can try posting relevant sections, but it would be difficult to get it working isolated.
#loads all environmental objects
class Environment:
def __init__(self, config, link):
self.link = link
#clear the scene
### THIS IS NOT WORKING
#for child in viz.MainScene.getChildren():
# child.remove()
backgroundcolor = config.GetVector('vDisplayBackgroundColor')
viz.clearcolor(backgroundcolor)
self.court = viz.addTexQuad(viz.WORLD, viz.MainScene, 100)
self.court.setEuler(0,90,0)
#grass field
if config.GetBool('bEnvGroundTexture'):
grass = viz.addTexture('res/grass.jpg')
grass.wrap(viz.WRAP_T, viz.REPEAT)
grass.wrap(viz.WRAP_S, viz.REPEAT)
scale = viz.Transform()
scale.setScale(10,10,1)
self.court.texmat(scale)
self.court.texture(grass)
#green plane
else:
self.court.color(0,.3,0)
self.court.disable(viz.LIGHTING)
farshizzo
01-18-2011, 02:51 PM
That's the problem with wanting to clear the entire scene, other modules might add their own hidden nodes to the scene which can cause problems when you delete them.
You can keep track of all the nodes you create and delete them individually, as Jeff already suggested.
The approach I would recommend is to create a root group node and add all your objects as children of it. Then you just need to delete the root node and all your objects will be cleared. Here is an example:# Root node for all objects
root = viz.addGroup()
# Add object underneath root
court = viz.addTexQuad(parent=root)
.
.
.
# This will delete all the objects added to root
root.remove()
miles
01-19-2011, 07:57 AM
Thanks, I will try making a group node. How would I define a shape with the root node as parent? I have this:
self.cylinder = vizshape.addCylinder(height, .02)
The vizshape commands accept the same optional arguments that you can use when creating other node3D objects. You can also use any node3D methods on the shape, such as <node3D>.parent().
miles
01-19-2011, 11:45 AM
In the documentation, I see only
<vizshape>.addCylinder(
height = 1.0
radius = 0.5
topRadius = None
bottomRadius = None
axis = vizshape.AXIS_Y
slices = 20
bottom = True
top = True
)
How can I specify a parent? Thanks again for all the help.
You can either do:
cylinder = vizshape.addCylinder(parent=root)
or
cylinder = vizshape.addCylinder()
cylinder.parent(root)
miles
01-19-2011, 04:09 PM
It's working fine now. Thanks Jeff and farshizzo!
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.