|
楼主 |
发表于 2009-10-30 11:39:59
|
显示全部楼层
本帖最后由 DancingGhost 于 2009-10-30 16:21 编辑
- class WorldCoordOfNodeVisitor :public osg::NodeVisitor
- {
- public:
- WorldCoordOfNodeVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS),done(false)
- {
- wMatrix = new osg::Matrix();
- }
- virtual void apply(osg::Node &node)
- {
- if(!done)
- {
- if (node.getName()=="root"){//到达最上层的PositionAttitudeTransform节点
- wMatrix->set(osg::computeLocalToWorld(this->getNodePath()));
- done = true;
- }
- traverse(node);
- }}
- osg::Matrix * getMatrix(){return wMatrix;}
- private:
- bool done;
- osg::Matrix *wMatrix;
- };
- int main()
- {
- osg::Group *group = new osg::Group();
- osg::PositionAttitudeTransform *last,*p= new osg::PositionAttitudeTransform();
- p->setName("root"); //设置最上层的PositionAttitudeTransform的Name为“root”,方便在NodeVisitor中使用
- group->addChild(p);
- for(int i=0;i<5;i++) {//创建一条连续的直线段
- last= new osg::PositionAttitudeTransform();
- last->addChild(createLine(osg::Vec3(0,0,0),osg::Vec3(0,4,4))); //加入直线节点
- last->setPosition(osg::Vec3(0,4,4));
- last->setAttitude(osg::Quat( osg::DegreesToRadians(i*10.0),osg::Vec3(0,1,0)));
- p->addChild(last);
- p = last;
- }
- osg::Node * line = last->getChild(0);
- if (line){ // 获取最末线段的结束端点的世界坐标,并在该坐标位置放置一个球,如果能成功获取到该点的坐标,那么最后球心也应该在此点
- WorldCoordOfNodeVisitor nodeVisitor;
- line->accept(nodeVisitor);
- osg::Vec3 pos = (*nodeVisitor.getMatrix())*osg::Vec3(0,4,4);
- p= new osg::PositionAttitudeTransform();
- p->addChild(createBall()); //创建一个球节点
- p->setPosition(pos); //将球节点移动到最末直线的结束点位置
- group->addChild(p);
- }
- ...
- }
复制代码
谢谢array,
我想这个应该差不多了,没办法再缩了吧,期待回复。 |
|