OSG 如何在地形上放置模型

這個問題可能是初學者都會碰到的問題,如何在地形上或者另外一個物體上放置其他的模型呢? 主要是用到了線交測繪的方法。 目的:在場景中我們已經有了一個地形 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 <osgGA/DriveManipulator>


void main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group>root = new osg::Group;


osg::ref_ptr<osg::Node> terrian = osgDB::readNodeFile("ceep.ive");


// createTank
osg::ref_ptr<osg::Node> tank = osgDB::readNodeFile("tank.osg");
osg::ref_ptr<osg::PositionAttitudeTransform> tankPosition = new osg::PositionAttitudeTransform;
tankPosition->addChild(tank);
//x,y 點  假設是 -10  -10
double tankXPosition = -5;
double tankYPosition = -5;


osg::LineSegment* tankLocationSegment = new osg::LineSegment;
//一條足夠長的線  <br>
tankLocationSegment->set(osg::Vec3(tankXPosition,tankYPosition,999),osg::Vec3(tankXPosition,tankYPosition,-999));
//將這條線添加到visitor中
osgUtil::IntersectVisitor tankElevationVisitor ;
tankElevationVisitor.addLineSegment(tankLocationSegment);//檢測出在terrian上的點
terrian->accept(tankElevationVisitor);
//得到  交點列表
osgUtil::IntersectVisitor::HitList tankElevationHitLists  = tankElevationVisitor.getHitList(tankLocationSegment);

osgUtil::Hit heightTestResult ;
if (tankElevationHitLists.empty()) 

std::cout<<"could not place a tank on this terrian!"<<std::endl;
return ; 
}
//第一個交點 ,轉換成世界座標<br>
heightTestResult = tankElevationHitLists.front();
osg::Vec3 terrianHeight = heightTestResult.getWorldIntersectPoint();


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章