|
刚开始学习,请教各位高手帮忙、!谢谢
下面是我的一部分程序代码。自己整理了一下。
可是不能正确显示出我所要的节点名称(Gang_gan)
在程序运行后,显示的是1-GEODE(见附件图),不知我该如何解决呢,谢谢!!
void cOSG::InitSceneGraph(void)
{
mRoot = new osg::Group;
mModel = osgDB::readNodeFile(m_ModelName);
mModel.get()->setName("Gang_gan");//此处是我设置的名称。如何可以是中文的就更好了,就是不知getName()支持中文吗?
osgUtil::Optimizer optimizer;
optimizer.optimize(mModel.get());
optimizer.reset();
//添加模型到场景中
mRoot->addChild(mModel.get());
}
//事件处理函数
bool CPickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::FRAME):
{
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
//得到视图矩阵
viewer ->getCamera() ->getViewMatrixAsLookAt(position, center, up) ;
if (viewer)
{
//执行PICK动作
pick(viewer,ea);
}
return false;
}
default:
return false;
}
}
//PICK动作
void CPickHandler::pick(osgViewer::Viewer* viewer, const osgGA::GUIEventAdapter& ea)
{
//创建一个线段交集检测对象,
//与交集包围盒的关系,并允许在某个子图形不可能存在有交集的子节点时,跳过该子图形的遍历。
osgUtil:ineSegmentIntersector::Intersections intersections;
std::string gdlist="";
//得到鼠标的位置
float x = ea.getX();
float y = ea.getY();
if(viewer->computeIntersections(x,y,intersections))
{
//得到相交交集的交点
for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();//用迭代器,指向交集
hitr != intersections.end();//若交集没有遍历完,继续
++hitr)
{
std:stringstream os;
if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))//若从根到选取物体(结点Geode)的路径不为空,并且该物体的name不为空,说明已经找到符合要求的物体,网上说这样可以把所有的结点的name取出来
{
os<<"This is a "<<hitr->nodePath.back()->getName()<<std::endl;//输出结点的名字(如何输出之前setName设置名字)
gdlist += os.str();
break;//只要找到第一个结点,根结点就可以了,找到就跳出循环
这里怎么会直接选取物体的最底的一层geode层,如何选Group层?如果注释去break,可以选到好多Geode
}
}
}
setLabel(gdlist);
} |
|