|
楼主 |
发表于 2012-10-12 21:41:47
|
显示全部楼层
本帖最后由 三叶侠客 于 2012-10-12 21:54 编辑
sy2178668 发表于 2012-10-12 10:53
刚看了下,house.osg里的节点有Line01,Pivot01,CasementWindow01,CasementWindow02。然后你自己用写个 ...
我参考海军教程,把里面的Switch节点改为MatrixTransform节点,写了以下代码找到了门的节点。请问接下来该怎么做,实现点击门后相机切换到房子里?是获取门的坐标吗?谢谢~~- #include<osg/PositionAttitudeTransform>
- #include<osg/Group>
- #include<osg/Node>
- #include<osgDB/ReadFile>
- #include<osgViewer/Viewer>
- #include <cstdlib>
- osg::Node*findNamedNode(const std::string&searchName,
- osg::Node*currNode)
- {
- osg::Group*currGroup;
- osg::Node*foundNode;
- //检查输入的节点是否是合法的,
- //如果输入节点为NULL,则直接返回NULL。
- if(!currNode)
- {
- return NULL;
- }
- //如果输入节点合法,那么先检查该节点是否就是我们想要的结果。
- //如果确为所求,那么直接返回输入节点。
- if(currNode->getName()==searchName)
- {
- return currNode;
- }
-
- //如果输入节点并非所求,那么检查它的子节点(不包括叶节点)情况。
- //如果子节点存在,则使用递归调用来检查每个子节点。
- //如果某一次递归的返回值非空,说明已经找到了所求的节点,返回其指针。
- //如果所有的节点都已经遍历过,那么说明不存在所求节点,返回NULL。
- currGroup=currNode->asGroup();//returns NULL if not a group.
- if(currGroup)
- {
- for(unsigned int i=0;i<currGroup->getNumChildren();i++)
- {
- foundNode=findNamedNode(searchName,currGroup->getChild(i));
- if(foundNode)
- return foundNode;//找到所求节点。
- }
- return NULL;//遍历结束,不存在所求节点。
- }
- else
- {
- return NULL;//该节点不是组节点,返回NULL
- }
- }
- int main()
- {
- osg::ref_ptr<osg::Group>root=new osg::Group();
- osg::ref_ptr<osg::Node>houseNode=osgDB::readNodeFile("\\mymodels\\house.osg");
- root->addChild(houseNode.get());
-
- osg::MatrixTransform*mynode=NULL;
- osg::Node*foundNode=NULL;
-
- foundNode=findNamedNode("Line01",root.get());
- mynode=(osg::MatrixTransform*)foundNode;
- if(!mynode)
- {
- std::cout<<"matrixtransform node not found,quitting."<<std::endl;system("pause");
- return -1;
- }
- else std::cout<<"matrixtransform node found,quitting."<<std::endl;system("pause");
- }
复制代码 |
|