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(); 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值