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

百科网站建设百度小说搜索风云榜排名

百科网站建设,百度小说搜索风云榜排名,最近高清中文在线国语字幕,黄江网站建设交运算与对象选取 在面对大规模的场景管理时,场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统,自然也实现了场景图形的交运算,交运算主要封装在osgUtil 工具中在OSG中,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_ptr<LineSegment> lineXY = new osg::LineSegment(newPos, m_vPosition);
osg::ref_ptr<osg::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_ptr<osgText::Text> updateText) :_updateText(updateText){}// 析构函数~CPickHandler(){}// 事件处理bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa);// pickvirtual void pick(osg::ref_ptr<osgViewer::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_ptr<osgText::Text> _updateText;
};// HUD
class CreateHUD
{
public:CreateHUD(){}~CreateHUD(){}// 创建HUDosg::ref_ptr<osg::Node> createHUD(osg::ref_ptr<osgText::Text> updateText){// 创建一个相机osg::ref_ptr<osg::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_ptr<osg::Geode> geode = new osg::Geode();osg::ref_ptr<osg::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_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::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_ptr<osgViewer::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_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::Group> root = new osg::Group();// 读取地形模型string strDataPath = strDataFolder + "lz.osg";osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);osg::ref_ptr<osgText::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/543280/

相关文章:

  • 做网站没有成本的方法上海百度分公司电话
  • 寺庙网站建设百度ai人工智能
  • 完成公司网站建设下载关键词推广软件
  • wordpress如何关闭网站下载app
  • WordPress小程序二次修改石家庄seo排名外包
  • 做百度关键词网站厦门seo外包
  • 泉州seo-泉州网站建设公司谷歌关键词搜索工具
  • 组织部网站建设方案行业关键词分类
  • 上海黄浦 网站制作中国搜索引擎排名2021
  • 手机网站建设 cms营销技巧和营销方法
  • 平顶山做网站优化微博搜索引擎优化
  • 网站如何做品牌宣传海报每日舆情信息报送
  • 做论坛网站需要多大空间seo推广招聘
  • 中国建设银行网站软件不限次数观看视频的app
  • 网站开发建设的步骤win11优化大师
  • 在线做数据图的网站樱桃bt磁力天堂
  • 网站建设费的税率东莞公司网上推广
  • 上海设计公司排名前十宁波seo搜索优化费用
  • 如皋做网站公司com域名
  • 织梦做企业网站教程网络营销推广方案论文
  • 微信如何添加小程序二十条优化措施全文
  • 网站制作费可以做业务宣传费河北百度推广电话
  • wordpress日主题破解网站排名优化软件有哪些
  • 做公众号app 网站 app济南网站设计
  • 单位网站 单位网页 区别吗福州seo顾问
  • 专业做网站制作的公司百度地图网页版进入
  • 买卖网站域名骗局百度推广登陆
  • 石家庄大型网站设计公司手机怎么建网站
  • 政府网站图解怎么做百度关键词排名靠前
  • 天津做网站印标东莞网络推广排名