Ümit,

Firstly, do you need to add MatrixTransforms above all your geodes, or just
the ones that have them now?

You have a couple of strategies.

The first one is to modify your model so it has uniquely named
_MatrixTransforms_ above every geode. At the moment they are all called the
same thing, so you end up finding 8 nodes when you look for a particular
name. I don't know much about 3DS, so if it were up to me I would probably
do it by hand editing the OSG file. However, this clearly impacts your art
path (because updates to your model will always involve some hand editing).
There is probably a way of persuading 3DS to name transforms... anybody?

The second one is more programmatic. Your geodes are, at least, all uniquely
named. You can search fo a geode, and then look for it's parent. If it's
parent is a MatrixTransform, then you have your node. e.g. (lots of checks
omitted)

   findNodeVisitor findNode("1_planetar");
   tankThreeGroup->accept(findNode);
   std::vector<osg::Node*> nodeList = findNode.getNodeList();
   osg::Node* node = nodeList[0]; // no check on size of list
   osg::MatrixTransform* tf =
dynamic_cast<osg::MatrixTransform>(node->getParent(0)); // no check on
whether there is more than one parent
   if(tf!=NULL) // do stuff

This route is hard to generalise. For example, there's no check on whether
any geodes share a MatrixTransform as a parent - in which case strange
things will happen later. Also if the parent isn't a MatrixTransform, you'll
want to add one as a child to said parent, and move the geode across to be a
child of the MatrixTransform via addChild, removeChild etc., which is a bit
trickier.

It will come down to how 3DStudio works in the end, I think, and what you
can persuade it to output so that your approach can be generalised.

David
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to