#1
|
|||
|
|||
Clearing the MainScene
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 |
#2
|
|||
|
|||
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.
|
#3
|
|||
|
|||
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.
|
#4
|
|||
|
|||
Try using viz.MainScene.getChildren() to get all the nodes in the scene.
|
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
Can you post some example code that shows the problem you're having?
|
#7
|
|||
|
|||
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) |
#8
|
|||
|
|||
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: Code:
# 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() |
#9
|
|||
|
|||
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) |
#10
|
|||
|
|||
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().
|
#11
|
|||
|
|||
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. |
#12
|
|||
|
|||
You can either do:
Code:
cylinder = vizshape.addCylinder(parent=root) Code:
cylinder = vizshape.addCylinder() cylinder.parent(root) |
#13
|
|||
|
|||
It's working fine now. Thanks Jeff and farshizzo!
|
|
|