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();}
heightTestResult=tankElevationHitLists.front();
osg::Vec3terrianHeight=heightTestResult.getWorldIntersectPoint();
tankPosition->setPosition(terrianHeight);
相关文章推荐
- OSG 如何在地形上放置模型
- 如何建立地球上任何一个区域的地形3d模型,并添加卫星或地貌贴图
- OSG点击场景中的某个物体,如何判断点击的物体,及处理此模型相关变换
- OSG学习笔记2:地形构建和模型加载
- OSG for Android实现VPB 9fd4 地形,倾斜影像与三维模型加载
- osg中添加到球面上的模型实现沿地形拖拽功能
- 工作中如何沟通? 立体沟通模型让你在职场如鱼得水!
- Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
- 有哪些类加载器?解释什么是双亲委派模型,为什么使用双亲委派模型,如何自定义类加载器?什么时候应该自定义类加载器?
- 游戏中如何加载人物,场景模型
- CityEngine下如何更好的实现影像与地形叠加
- 如何从小工到专家——Dreyfus模型应用[推荐]
- 基于RBAC模型的权限设计:如何设计系统权限体系?
- 如何利用ArcScene制作简单的三维模型
- ”盒模型“之如何防止边框和内边距把元素撑开
- ADO.NET Entity Framework如何:通过每种类型多个实体集定义模型(实体框架)
- ADO.NET Entity Framework 如何:通过每个层次结构一个表继承以定义模型(实体框架)
- Revit模型流转过程中如何避免盗图
- 如何改变word修订模型下的视图
- django 模型更改后如何更新至数据库(暴力版)