osg节点拾取

2024-06-07 18:18
文章标签 osg 拾取 节点

本文主要是介绍osg节点拾取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                      欢迎关注公众号可以查看更多完整文章

使用Scribe特效实现白色轮廓,此类在osgFx模块里面。

所有场景中的节点全部添加Scribe特效。

通过继承GUIEventHandler来自定义鼠标对应动作时,需要进行何种操作。

在事件处理器类中,实现左键时判断鼠标点击位置是否和节点相交,然后隐藏特效;

右键时恢复特效。

判断是否相交,使用computeIntersections来计算,这是osgViewer的函数。

完整代码:

#include <osg/Group>
#include <osgViewer/Viewer>
#include <osgGA/GUIEventHandler>
#include <osg/ShapeDrawable>
#include <osgFX/Scribe>
#include <osg/Node>
#include <osgDB/ReadFile>#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgviewerd.lib")
#pragma comment(lib,"osgFXd.lib")
#pragma comment(lib,"osggad.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib,"osgdbd.lib")class CEventHandler :public osgGA::GUIEventHandler
{
public:CEventHandler(osgViewer::Viewer *viewer) :m_pThis(viewer){};virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ga){switch (ea.getEventType()){case osgGA::GUIEventAdapter::PUSH:Pick(ea.getX(), ea.getY(), ea.getButton());break;default:break;}return true;}protected:void Pick(float x, float y,int button){osgUtil::LineSegmentIntersector::Intersections datas;if (button == 1 && m_pThis->computeIntersections(x, y, datas))//左键隐藏{for (auto it = datas.begin(); it != datas.end();it++){osg::NodePath nodePath = it->nodePath;for (int i = 0; i < nodePath.size(); i++){osgFX::Scribe *sc = dynamic_cast<osgFX::Scribe*>(nodePath[i]);if (sc){auto it = std::find(m_scribeList.begin(), m_scribeList.end(), sc);if (it != m_scribeList.end())continue;sc->setNodeMask(0);m_scribeList.push_back(sc);}}}}else if (button == 4)//右键显示{for (auto it = m_scribeList.begin(); it != m_scribeList.end();it++)it->get()->setNodeMask(1);m_scribeList.clear();}}osgViewer::Viewer* m_pThis;osg::NodeList m_scribeList;
};int main(int argc, char **argv)
{osgViewer::Viewer viewer;osg::ref_ptr<osg::Group> group = new osg::Group;osg::ref_ptr<osg::ShapeDrawable> coneDraw = new osg::ShapeDrawable(new osg::Cone(osg::Vec3(10.f, 0.f, 0.f), 2.f, 40.f));osg::ref_ptr<osg::ShapeDrawable> sphereDraw = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(-10.f, 0.f, 0.f), 2.f));osg::ref_ptr<osgFX::Scribe> scribe1 = new osgFX::Scribe;osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("cessna.osgt");//scribe1->setNodeMask(0);scribe1->addChild(node1);osg::ref_ptr<osgFX::Scribe> scribe2 = new osgFX::Scribe;osg::ref_ptr<osg::Node> node2 = osgDB::readNodeFile("cow.osgt");//scribe2->setNodeMask(0);scribe2->addChild(node2);group->addChild(node1);group->addChild(node2);group->addChild(scribe1);group->addChild(scribe2);viewer.setSceneData(group);viewer.addEventHandler(new CEventHandler(&viewer));viewer.realize();return viewer.run();
}


本文地址:osg节点拾取_GreenArrowMan-CSDN博客-CSDN博客

源码下载:osg节点选择-C++代码类资源-CSDN下载

这篇关于osg节点拾取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039934

相关文章

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

(13)DroneCAN 适配器节点(一)

文章目录 前言 1 特点 2 固件  3 ArduPilot固件DroneCAN设置 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的功能。如允许 I2C 设备(如罗盘或空速)距离自动驾驶仪 1m 以上,并实现多达 32 个伺服输出通道。

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

OSG学习:阴影代码示例

效果图: 代码示例: #include <osgViewer/Viewer>#include <osg/Node>#include <osg/Geode>#include <osg/Group>#include <osg/Camera>#include <osg/ShapeDrawable>#include <osg/ComputeBoundsVisitor>#include

OSG数学基础:坐标系变换

三维实体对象需要经过一系列的坐标变换才能正确、真实地显示在屏幕上。在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的。坐标系变换通常包括:世界坐标系-物体坐标系变换、物体坐标系-世界坐标系变换和世界坐标系-屏幕坐标系变换(一个二维平面坐标系,即显示器平面,是非常标准的笛卡尔坐标系的第一象限区域)。 世界坐标系-物体坐标系变换 它描述的问题主要是关于物体本身的

OSG数学基础:坐标系统

坐标系是一个精确定位对象位置的框架,所有的图形变换都是基于一定的坐标系进行的。三维坐标系总体上可以分为两大类:左手坐标系和右手坐标系。常用的坐标系:世界坐标系、物体坐标系和摄像机坐标系。 世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架。从另一方面说,能够用世界坐标系来描述其他坐标系的位置,而不能用更大的、外部的坐标系来描述世界坐标系。世界坐标系也被广泛地

osg::Vec2 Vec3 Vec4

osg::Vec2可以用于保存2D纹理坐标。 osg::Vec3是一个三维浮点数数组。 osg::Vec4用于保存颜色数据。

OSG学习:转动的小汽车示例

由于只是简单的示例,所以小汽车的模型也比较简单,是由简单的几何体组成。 代码如下: #include <osg\ShapeDrawable>#include <osg\AnimationPath>#include <osg\MatrixTransform>#include<osgDB\ReadFile>#include<osgViewer\Viewer>osg::MatrixTr

OSG学习:使用已有回调示例

回调的类型有很多种,一般很容易就想到的是UpdateCallBack,或者EventCallBack,回调的意思就是说,你可以规定在某件事情发生时启动一个函数,这个函数可能做一些事情。这个函数就叫做回调函数。 #include<osg\MatrixTransform>#include<osg\PositionAttitudeTransform>#include<osg\Geode>#

leetcode刷题(36)——24.两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3 题解: 这个题目有2种解法,一个是比较容易想到的循环求解,另外一个是比较难想到的递归求解 解法1:循环求解 关键点在于设置一个pre节点指向链表的头节点,很多链表题目的技巧都是这样设置一个pre