当前位置: 首页 > news >正文

营销型网站规划步骤代理注册

营销型网站规划步骤,代理注册,网盘资源,百度关键词收费标准交运算与对象选取 在面对大规模的场景管理时#xff0c;场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统#xff0c;自然也实现了场景图形的交运算#xff0c;交运算主要封装在osgUtil 工具中在OSG中#xff0c;osgUtil是一个非常强有力的工…交运算与对象选取 在面对大规模的场景管理时场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统自然也实现了场景图形的交运算交运算主要封装在osgUtil 工具中在OSG中osgUtil是一个非常强有力的工具集合了场图形处理、几何体修改工具及高层次的遍历几个功能。 交运算 交运算(Intersection)本身是一个非常复杂的立体几何问题。当在阅读这一部分源代码时读者会发现如果有非常丰富的立体几何思想见解将能够很快理解源代码如果没有的话即使笔者在这里分析源代码也是没有用的。当然作为一个应用者没有必要去过多关注底层是如何实现的。 关于交运算OSG本身的实现也是比较局限的但是对于普通应用已经足够了可以用一个继承关系图表示出来如图8-21所示。 图8-21 osgUtil::Intersector 的继承关系及派生图 从继承关系图中可以看出所有的交运算都共用一个父类osgUtil::Intersector类。下面对这个类的作用逐一说明。 osgUtil::Intersector:是一个纯虚类它定义了相交测试的接口osgUtil库从osgUtil::Intersection继承了多个类适用于各种类型的几何体(如线段、多边形等)。执行相交测试时应用程序将继承自osgUtil::Intersector的某个类实例化再将其传递给 osgUtil::IntersectionVisitor 的实例并请求该实例返回数据以获取交运算的结果。osgUtil::LineSegmentIntersector继承自osgUtil::Intersector 类用于检测指定线段和场景图形之间的相交情况并向程序提供查询相交测试结果的函数。该类提供了一种定义射线的方法。它包括两个osg::Vec3实例一个用于定义线段的起点另一个用于定义终点。当交集测试被触发时它将检测射线的相交情况并执行相应的操作。这个在示例显示位置及拾取示例中会用到可以根据鼠标的位置初始化一个osgUtil::LineSegmentIntersector类的对象可以指定一个特定的线段来执行相交检测在构造函数中即可初始化。 // 创建一个线段交集检测对象 osgUtil::LineSegmentIntersector::Intersections intersections: viewer-computelntersections(x,y,intersections) 通过相交运算更多的是希望得到相交的点可以通过申请一个迭代器来实现代码如下: // 得到相交交集的交点for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr intersections.begin();hitr!intersections.end();hitr) {// 输入流cout”Mouse in world X:”hitr-getWorldIntersectPoint().x()” Y:”hitr-getWorldIntersectPoint().y()” Z:”hitr-getWorldIntersectPoint().z()endl; } osgUtil::PolytopeIntersector与osgUtil::LineSegmentIntersector类似不过该类用于检测由一系列平面构成的多面体的相交运算。当鼠标单击场景图形中某一区域希望拾取到鼠标位置附近的一个封闭多面体区域时osgUtil::PolytopeIntersector类最实用。osgUtil::PlaneIntersector与osgUtil::LineSegmentIntersector类似用于检测出一系列平面构成的平面的相交运算。 osgUtil::IntersectionVisitor是一个比较特殊的类它不直接继承自osgUtil::Intersector继承关系图如图8-22所示。 图8-22 osgUtil::IntersectionVisitor 的继承关系图 从继承关系图可以看出它继承自osg::NodeVisitor创建和触发机制与osg::NodeVisitor 实例大致相似。访问器需要维护一个进行交集测试的线段列表而对于其中的每一条线段访问器都会创建一个交点列表(osgUtil::IntersectVisitor::HitList 实例)它主要用于搜索场景图形中与指定几何体相交的节点。而最后相交测试的工作将在osgUtil::Intersector 的继承类中完成。在前面的自定义漫游操作器中碰掩检测就是采用该类最后的检测工作在osgUtil::LineSegmentIntersector 中完成创建的过程如下: // 创建一个交集访问器 osgUtil::IntersectVisitor ivXY; // 根据新的位置得到两条线段检测 osg::ref_ptrLineSegment lineXY new osg::LineSegment(newPos, m_vPosition); osg::ref_ptrosg::LineSegment lineZ new osg::LineSegment(newPos1 osg::Vec3(0.0,0.0,10.0), newPos1 - osg::Vec3(0.0,0.0,-10.0)); // 添加两条线段 ivXY.addLineSegment(lineZ.get()); ivXY.addLineSegment(lineXY.get());// 开启交集检测 m_pHowViewer-getSceneData()-accept(ivXY);交点列表(osgUtil::IntersectVisitor:HitList)的作用为:一条单一的线段可能与场景中的多个几何体实例(或者多次与同一个几何体)产生交集。对于每一条参与交集测试的线段系统均会产生一个列表这个列表包含了所有交集测试产生的 Hit 实例。如果没有监测到任何交集该列表保持为空。 显示位置及拾取示例 显示位置及拾取示例的代码如程序清单 8-10所示 /******************************************* 显示位置及拾取示例 *************************************/ // pick 事件处理器 class CPickHandler:public osgGA::GUIEventHandler { public:// 构造函数CPickHandler(osg::ref_ptrosgText::Text updateText) :_updateText(updateText){}// 析构函数~CPickHandler(){}// 事件处理bool handle(const osgGA::GUIEventAdapter ea, osgGA::GUIActionAdapter aa);// pickvirtual void pick(osg::ref_ptrosgViewer::Viewer viewer, const osgGA::GUIEventAdapter ea);// 设置显示内容void setLabel(const std::string name){_updateText-setText(name);} protected:// 得到当前视图矩阵osg::Vec3 position;osg::Vec3 center;osg::Vec3 up;// 传递一个文字对象osg::ref_ptrosgText::Text _updateText; };// HUD class CreateHUD { public:CreateHUD(){}~CreateHUD(){}// 创建HUDosg::ref_ptrosg::Node createHUD(osg::ref_ptrosgText::Text updateText){// 创建一个相机osg::ref_ptrosg::Camera hudCamera new osg::Camera;// 设置绝对帧引用hudCamera-setReferenceFrame(osg::Transform::ABSOLUTE_RF);// 设置正投影矩阵2DhudCamera-setProjectionMatrixAsOrtho2D(0, 1280, 0, 1024);// 设置视图矩阵hudCamera-setViewMatrix(osg::Matrix::identity());// 设置渲染顺序为POSThudCamera-setRenderOrder(osg::Camera::POST_RENDER);// 清除深度缓存hudCamera-setClearMask(GL_DEPTH_BUFFER_BIT);// 设置字体string timesFont D:\\WorkAndStudy\\SDK\\VS2013\\OSG\\Data\\font\\cour.ttf;// 设置位置osg::Vec3 position(700, 900, 0.0);osg::ref_ptrosg::Geode geode new osg::Geode();osg::ref_ptrosg::StateSet stateset geode-getOrCreateStateSet();// 关闭光照stateset-setMode(GL_LIGHTING, osg::StateAttribute::OFF);//关闭深度测试stateset-setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);geode-addDrawable(updateText.get());hudCamera-addChild(geode.get());updateText-setCharacterSize(20.0f);updateText-setFont(timesFont);updateText-setColor(osg::Vec4(1.0f, 1.0, 1.0, 1.0));updateText-setText();updateText-setPosition(position);// 设置数据变量为DYNAMICupdateText-setDataVariance(osg::Object::DYNAMIC);return hudCamera.get();} };/* 显示位置及拾取示例 */ void pickLineSegment_8_10(const string strDataFolder);/******************************************* 显示位置及拾取示例 *************************************/ // 事件处理函数 bool CPickHandler::handle(const osgGA::GUIEventAdapter ea, osgGA::GUIActionAdapter aa) {switch (ea.getEventType()){// 每一帧case(osgGA::GUIEventAdapter::FRAME) :{osg::ref_ptrosgViewer::Viewer viewer dynamic_castosgViewer::Viewer*(aa);// 得到视图矩阵viewer-getCamera()-getViewMatrixAsLookAt(position, center, up);if (viewer){// 执行PICK动作pick(viewer.get(), ea);}return false;}default:return false;} }// PICK动作 void CPickHandler::pick(osg::ref_ptrosgViewer::Viewer viewer, const osgGA::GUIEventAdapter ea) {// 创建一个线段交集检测对象osgUtil::LineSegmentIntersector::Intersections intersections;std::string gdlist ;// 申请一个流std::ostringstream os;// 得到鼠标的位置float x ea.getX();float y ea.getY();// 如果没有发生交集运算及鼠标没有点中物体if (viewer-computeIntersections(x, y, intersections)){// 得到相交交集的交点for (osgUtil::LineSegmentIntersector::Intersections::iterator hitr intersections.begin(); hitr ! intersections.end(); hitr){// 输入流os Mouse in World X: hitr-getWorldIntersectPoint().x() Y: hitr-getWorldIntersectPoint().y() Z: hitr-getWorldIntersectPoint().z() endl;}}// 输入流os Viewer Position X: position[0] Y: position[1] Z: position[2] endl;gdlist os.str();// 设置显示内容setLabel(gdlist); }void pickLineSegment_8_10(const string strDataFolder) {// 创建Viewer对象场景浏览器osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();osg::ref_ptrosg::Group root new osg::Group();// 读取地形模型string strDataPath strDataFolder lz.osg;osg::ref_ptrosg::Node node osgDB::readNodeFile(strDataPath);osg::ref_ptrosgText::Text updateText new osgText::Text();CreateHUD *hudText new CreateHUD();// 添加到场景root-addChild(node);root-addChild(hudText-createHUD(updateText));// 添加PICK事件处理器viewer-addEventHandler(new CPickHandler(updateText));// 优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root);viewer-setSceneData(root);viewer-realize();viewer-run(); }运行程序截图如图 8-23 所示。 图8-23显示位置及拾取示例截图
http://www.hkea.cn/news/14364822/

相关文章:

  • 怎么做视频解析网站哈尔滨建站怎么做
  • 个人做跨境电商的平台网站电脑行业网站模板
  • 网站建设怎么加音乐贵阳手机银行app下载
  • 网站制作公司咨询快站 淘宝优惠券
  • 做网站准备什么问题做的网站放在阿里云
  • php律师网站源码广告设计专业介绍
  • 如何用手机建网站怎么做网络运营
  • 有专做高端折扣女装的网站吗中国旅游电子商务网站建设情况
  • 网站开发网上宠物店管理系统购买网站建设需要注意
  • 旅游网站建设网站推广电子商务网站建设与管理设计报告
  • 网站开发方向行业现状网站服务器作用
  • 网站建设需求列表wordpress命令执行时间
  • 做网站上饶工信部网站备案多久
  • 哪里有建设网站中的视频商城网站的psd模板免费下载
  • 西青天津网站建设长沙广告网络公司
  • 如何查看网站使用什么程序做的安徽网站设计方案
  • 搜索引擎网站推广定义淘宝店铺
  • 中国林业网站群建设工程陕西 做网站的公司
  • 沃然建站平台官网设计排版优秀网站
  • 电子商务网站设计是什么wordpress伪静态 宝塔
  • 网站改版百度提交网站建设微信运营公司
  • 淘宝优惠劵网站怎么做如何利用网站推广业务
  • 网站建设店铺mip网站有什么好处
  • 国外html5网站源码i网站制作
  • 东莞市专注网站建设服务机构网站该怎么做链接
  • 自适应 WordPress 主题建站合肥网络公司seo
  • 重庆大渝网东莞网络优化推广
  • 公司网站建站模板设计师网站模版
  • 企业移动网站制作沈阳有限公司
  • 网站h5什么意思家政网站开发