查看: 1231|回复: 7

Group的拾取问题

[复制链接]

该用户从未签到

发表于 2010-12-30 13:29:29 | 显示全部楼层 |阅读模式
我自定义了一个Group类,然后再它的一个对象中添加了几个子节点,但是对它拾取时总是没反应,有谁能说下对Group进行拾取时必须的几个过程么?

该用户从未签到

发表于 2010-12-30 15:58:57 | 显示全部楼层
请您参考osgpick这个例子~~~

该用户从未签到

 楼主| 发表于 2010-12-31 10:35:38 | 显示全部楼层
2# FlySky 这个例子早看过了,我现在能够拾取由osgDB::readNodeFile读取的节点,但是不能拾取自定义的Group节点,需要什么其他的东西么?加了
dirtyBound()也没反应

该用户从未签到

发表于 2010-12-31 10:42:12 | 显示全部楼层
这取决于您的自定义Group的具体写法

该用户从未签到

 楼主| 发表于 2010-12-31 12:31:48 | 显示全部楼层
4# array 目前这个自定义的Group类和基类osg::Group基本没区别,我把相关代码提取出来写了个简单的控制台测试程序,代码如下:
class CustomNode:public osg::Group
{
public:
CustomNode(float x,float y,float z):_x(x),_y(y),_z(z)
{
}
~CustomNode()
{
}
void Init()
{
  osg::Geode *geo=new osg::Geode;
  osg::Geometry *gem=new osg::Geometry;
  geo->addDrawable(gem);
  addChild(geo);
  osg::Vec3Array *verticesArray=new osg::Vec3Array;
  verticesArray->push_back(osg::Vec3(-_x/2.0,-_y/2.0,_z/2.0));
  verticesArray->push_back(osg::Vec3(-_x/2.0,-_y/2.0,-_z/2.0));
  verticesArray->push_back(osg::Vec3(_x/2.0,-_y/2.0,-_z/2.0));
  verticesArray->push_back(osg::Vec3(_x/2.0,-_y/2.0,_z/2.0));
  verticesArray->push_back(osg::Vec3(-_x/2.0,_y/2.0,_z/2.0));
  verticesArray->push_back(osg::Vec3(-_x/2.0,_y/2.0,-_z/2.0));
  verticesArray->push_back(osg::Vec3(_x/2.0,_y/2.0,-_z/2.0));
  verticesArray->push_back(osg::Vec3(_x/2.0,_y/2.0,_z/2.0));
  gem->setVertexArray(verticesArray);
  osg::Vec4Array *colorArray=new osg::Vec4Array;
  colorArray->push_back(osg::Vec4(0.0,0.0,0.0,1.0));
  colorArray->push_back(osg::Vec4(1.0,0.0,0.0,1.0));
  colorArray->push_back(osg::Vec4(0.0,1.0,0.0,1.0));
  colorArray->push_back(osg::Vec4(0.0,0.0,1.0,1.0));
  colorArray->push_back(osg::Vec4(1.0,1.0,0.0,1.0));
  colorArray->push_back(osg::Vec4(1.0,0.0,1.0,1.0));
  colorArray->push_back(osg::Vec4(0.0,1.0,1.0,1.0));
  colorArray->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
  gem->setColorArray(colorArray);
  gem->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
  osg:rawElementsUInt *back=new osg::DrawElementsUInt(osg:rimitiveSet:UADS,0);
  back->push_back(3);
  back->push_back(2);
  back->push_back(1);
  back->push_back(0);
  osg::DrawElementsUInt *front=new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0);
  front->push_back(4);
  front->push_back(5);
  front->push_back(6);
  front->push_back(7);
  osg::DrawElementsUInt *left=new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0);
  left->push_back(0);
  left->push_back(1);
  left->push_back(5);
  left->push_back(4);
  osg::DrawElementsUInt *right=new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0);
  right->push_back(7);
  right->push_back(6);
  right->push_back(2);
  right->push_back(3);
  osg::DrawElementsUInt *bottom=new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0);
  bottom->push_back(5);
  bottom->push_back(1);
  bottom->push_back(2);
  bottom->push_back(6);
  osg::DrawElementsUInt *top=new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0);
  top->push_back(0);
  top->push_back(4);
  top->push_back(7);
  top->push_back(3);
  gem->addPrimitiveSet(front);
  gem->addPrimitiveSet(back);
  gem->addPrimitiveSet(left);
  gem->addPrimitiveSet(right);
  gem->addPrimitiveSet(top);
  gem->addPrimitiveSet(bottom);
  
}
private:
float _x;
float _y;
float _z;
};

class CustomHandler:public osgGA::GUIEventHandler
{
public:
CustomHandler(){}
~CustomHandler(){}
bool handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa)
{
  osgViewer::Viewer *viewer=dynamic_cast<osgViewer::Viewer*>(&aa);
  if(!viewer) return false;
  switch(ea.getEventType())
  {
  case osgGA::GUIEventAdapter::PUSH:
   if(ea.getButton()==1)
   {
    osgUtil:ineSegmentIntersector::Intersections intersections;
    if(viewer->computeIntersections(ea.getX(),ea.getY(),intersections))
    {
     for(osgUtil::LineSegmentIntersector::Intersections::iterator hits=intersections.begin();
      hits!=intersections.end();++hits)
     {
      if(!hits->nodePath.empty()&&!(hits->nodePath.back()->getName().empty()))
      {
       osg::NodePath np=hits->nodePath;
       for(int i=np.size()-1;i>=0;--i)
       {
        CustomNode* sc=dynamic_cast<CustomNode*>(np);
        if(sc!=NULL)
        {
         osg::Group *par_node=sc->getParent(0);
         par_node->removeChild(sc);
         return true;
        }
       }
      }
     }
    }
   }
  }
  return false;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
osg::Group *root=new osg::Group;
CustomNode *cus_node=new CustomNode(10,10,10);
cus_node->Init();
osg::StateSet *ss=cus_node->getOrCreateStateSet();
ss->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
root->addChild(cus_node);
osgViewer::Viewer *viewer=new osgViewer::Viewer;
viewer->setSceneData(root);
viewer->run();
return 0;
}

运行结果画了个立方体,不过不管我怎么点击鼠标都没反应

该用户从未签到

 楼主| 发表于 2010-12-31 12:39:29 | 显示全部楼层
复制掉了一句viewer->addEventHandler(new CustomHandler());还有
如果我把CustomNode的Init函数实现改成addChild(osgDB::readNodeFile("cow.osg"));运行后点击鼠标就有反应了

该用户从未签到

发表于 2011-1-4 09:27:46 | 显示全部楼层
首先,您的程序在我这里测试求交是肯定可以的,computeIntersections已经可以确信得到了交点。

您的条件判断有待商榷:
  1. if(!hits->nodePath.empty()&&!(hits->nodePath.back()->getName().empty()))
复制代码
我没有看到您对这里任何一个节点有setName()的动作,这样的话,节点名称肯定为空,那么这个条件永远都不成立,您是否在这里遗漏了什么

该用户从未签到

 楼主| 发表于 2011-1-4 11:16:11 | 显示全部楼层
7# array 谢谢Array,我把判断语句后面的部分去掉,问题就解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表