PDA

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

Jeff
01-18-2011, 11:33 AM
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.

Jeff
01-18-2011, 01:22 PM
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)

Jeff
01-19-2011, 11:02 AM
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.

Jeff
01-19-2011, 02:38 PM
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!