这个问题可能是初学者都会碰到的问题,如何在地形上或者另外一个物体上放置其他的模型呢? 主要是用到了线交测绘的方法。 目的:在场景中我们已经有了一个地形 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"
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.flt");
osg::ref_ptr<osg::PositionAttitudeTransform> tankPosition = new osg::PositionAttitudeTransform; tankPosition->addChild(tank); //x,y 点 假设是 -10 -10 double tankXPosition = -10; double tankYPosition = -10; osg::LineSegment* tankLocationSegment = new osg::LineSegment; //一条足够长的线
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 ; } //第一个交点 ,转换成世界坐标
heightTestResult = tankElevationHitLists.front(); osg::Vec3 terrianHeight = heightTestResult.getWorldIntersectPoint(); tankPosition->setPosition(terrianHeight);
 
//osg::ref_ptr<osgUtil::LineSegmentIntersector> // viewer.setCameraManipulator(new DriveManipulator()); //root->addChild(tank); root->addChild(tankPosition); root->addChild(terrian); viewer.setSceneData(root); viewer.realize(); viewer.run(); }

  

posted on 2012-07-07 16:14  筋肉强打  阅读(1386)  评论(0编辑  收藏  举报