[osg-users] [osgPlugins] Updating vertices properly + pick only one Geometry object
jean-sebastien.guay at cm-labs.com
Sat Nov 14 12:14:41 PST 2009
> 1. My current project is developing a cloth simulation and it is working. The model consists of particles connected with springs. To visualize everything I use a Geometry object representing a triangle mesh, which I update every time step by first calling the dirtyDisplayList() function. This is not a very clean solution, but OSG is rather big and not everything has been documented, so perhaps one of you know where I should be looking for a cleaner solution.
Well, I don't think there's anything "cleaner" than that, but more
efficient probably: For dynamic geometry, you should disable display
lists and use vertex buffer objects.
> There is osgParticle and osgAnimation, though I get the impression that osgParticle has been designed for unconnected particles.
Indeed osgParticle is for unconnected particle simulations like rain,
dust, splashes, fire, smoke...
osgAnimation is for keyframe animation, skinning, etc. Not really what
you're looking for.
I think you're doing it right, generating the geometry yourself so you
have good control over it. So if you use VBOs instead of display lists
it'll be faster, and I think you'll be fine.
> 2. I want to select particles with the mouse using a pick operation and this is working now for all objects in the scene. I only need to pick the cloth's particles, but how do I let OSG only do intersection tests on the cloth's geometry?
Set the geometry's node mask to some non-zero value A, other objects'
node masks to some other non-zero value B which does not contain A
(bitwise), and set your intersection visitor's traversal mask to A.
For example, set the node mask on the geometry you want pickable to 2,
and the node mask on the other geometry to ~2 (or 4, or 8, or whatever
does not bitwise contain 2). Then set the node mask on your intersection
visitor to 2.
Any traversal in OSG uses node masks to know whether to continue
traversing down the graph. The mask of the current node is bitwise-anded
with the visitor's traversal mask, and if the result is not 0 then it
will traverse into the node's children. So the above has two implications:
A) since your intersection visitor's node mask matches the pickable
node's mask (bitwise) but not the unpickable nodes', it will only
consider the pickable node in its intersection tests.
B) since the default traversal mask is 0xFFFFFFFF (i.e. all bits set),
all nodes will still be rendered since the only way to get a bitwise-and
value of 0 when the traversal mask is 0xFFFFFFFF would be to set the
node mask to 0 too.
Hope this helps,
Jean-Sebastien Guay jean-sebastien.guay at cm-labs.com
More information about the osg-users