您的位置:首页 > 其它

OSG 如何在地形上放置模型

2012-07-07 16:14 405 查看
这个问题可能是初学者都会碰到的问题,如何在地形上或者另外一个物体上放置其他的模型呢?主要是用到了线交测绘的方法。目的:在场景中我们已经有了一个地形terrain,在这上面我们要放一辆坦克,该如何操作呢?原理如下:我们假设有一条线起点是(x,y,-999),终点是(x,y,999)。如果这条线和terrain有交点,我们可以得到交点(x,y,z),也即是说这个点一定会是附在terrain上,至于是正面还是负面,取决于你的起点和终点的设置。得到了这个点,我们将它设置给模型就OK了。

#include<osgDB/ReadFile> #include<osgViewer/Viewer> #include<osg/LineSegment> #include<osg/PositionAttitudeTransform> #include<osgUtil/IntersectVisitor> #include"my.h" voidmain() { osgViewer::Viewerviewer; osg::ref_ptr<osg::Group>root=newosg::Group; osg::ref_ptr<osg::Node>terrian=osgDB::readNodeFile("ceep.ive"); //createTank osg::ref_ptr<osg::Node>tank=osgDB::readNodeFile("tank.flt"); osg::ref_ptr<osg::PositionAttitudeTransform>tankPosition=newosg::PositionAttitudeTransform; tankPosition->addChild(tank); //x,y点假设是-10-10 doubletankXPosition=-10; doubletankYPosition=-10; osg::LineSegment*tankLocationSegment=newosg::LineSegment; //一条足够长的线 tankLocationSegment->set(osg::Vec3(tankXPosition,tankYPosition,999),osg::Vec3(tankXPosition,tankYPosition,-999)); //将这条线添加到visitor中 osgUtil::IntersectVisitortankElevationVisitor; tankElevationVisitor.addLineSegment(tankLocationSegment); //检测出在terrian上的点 terrian->accept(tankElevationVisitor); //得到交点列表 osgUtil::IntersectVisitor::HitListtankElevationHitLists=tankElevationVisitor.getHitList(tankLocationSegment);

osgUtil::HitheightTestResult;if(tankElevationHitLists.empty()){std::cout<<"couldnotplaceatankonthisterrian!"<<std::endl;return;}//第一个交点,转换成世界坐标
heightTestResult=tankElevationHitLists.front();
osg::Vec3terrianHeight=heightTestResult.getWorldIntersectPoint();

tankPosition->setPosition(terrianHeight);

//osg::ref_ptr<osgUtil::LineSegmentIntersector>//viewer.setCameraManipulator(newDriveManipulator());//root->addChild(tank);root->addChild(tankPosition);root->addChild(terrian);viewer.setSceneData(root);viewer.realize();viewer.run();}

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: