场景交互与场景漫游-对象选取(8-2)
对象选取示例的代码如程序清单8-11所示:
/******************************************* 对象选取示例 *************************************/
// 对象选取事件处理器
class PickHandler :public osgGA::GUIEventHandler
{
public:PickHandler() :_mx(0.0f), _my(0.0f){}~PickHandler(){}// 事件处理函数bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa){osg::ref_ptr<osgViewer::View> view = dynamic_cast<osgViewer::View*> (&aa);if (!view){return false;}switch (ea.getEventType()){// 鼠标按下case(osgGA::GUIEventAdapter::PUSH) :{// 更新鼠标位置_mx = ea.getX();_my = ea.getY();break;}case(osgGA::GUIEventAdapter::RELEASE) :{if (_mx == ea.getX() && _my == ea.getY()){// 执行对象选取pick(view.get(), ea.getX(), ea.getY());}break;}default:break;}return false;}// 对象选取事件处理器void pick(osg::ref_ptr<osgViewer::View> view, float x, float y){osg::ref_ptr<osg::Node> node = new osg::Node();osg::ref_ptr<osg::Group> parent = new osg::Group();// 创建一个线段交集检测函数osgUtil::LineSegmentIntersector::Intersections intersections;if (view->computeIntersections(x, y, intersections)){osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();osg::NodePath &nodePath = intersection.nodePath;// 得到选择的物体node = (nodePath.size() >= 1) ? nodePath[nodePath.size() - 1] : 0;parent = (nodePath.size() >= 2) ? dynamic_cast<osg::Group*>(nodePath[nodePath.size() - 2]) : 0;}// 用一种高亮显示来显示物体已经被选中if (parent.get() && node.get()){osg::ref_ptr<osgFX::Scribe> parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent.get());if (!parentAsScribe){// 如果对象选择列,高亮显示osg::ref_ptr<osgFX::Scribe> scribe = new osgFX::Scribe();scribe->addChild(node.get());parent->replaceChild(node.get(), scribe.get());}else{// 乳沟没有选择到,则移除高亮显示的对象osg::Node::ParentList parentList = parentAsScribe->getParents();for (osg::Node::ParentList::iterator itr = parentList.begin(); itr != parentList.end(); ++itr){(*itr)->replaceChild(parentAsScribe.get(), node.get());}}}}
public:// 得到鼠标的位置float _mx;float _my;
};/* 对象选取示例 */
void pickObject_8_11(const string &strDataFolder);/* 对象选取示例 */
void pickObject_8_11(const string &strDataFolder)
{// 创建Viewer对象,场景浏览器osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();viewer->addEventHandler(new PickHandler());osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;traits->x = 40;traits->y = 40;traits->width = 600;traits->height = 480;traits->windowDecoration = true;traits->doubleBuffer = true;traits->sharedContext = 0;osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());osg::ref_ptr<osg::Camera> camera = new osg::Camera;camera->setGraphicsContext(gc.get());camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;camera->setDrawBuffer(buffer);camera->setReadBuffer(buffer);viewer->addSlave(camera.get());// 创建场景租节点osg::ref_ptr<osg::Group> root = new osg::Group();// 创建一个节点,读取牛的模型string strDataPath = strDataFolder + "cow.osg";osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);// 添加到场景root->addChild(node);// 优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root);viewer->setSceneData(root);viewer->realize();viewer->run();
}
运行程序,截图如图8-24所示。

图8-24对象选取示例截图
相关文章:
场景交互与场景漫游-对象选取(8-2)
对象选取示例的代码如程序清单8-11所示: /******************************************* 对象选取示例 *************************************/ // 对象选取事件处理器 class PickHandler :public osgGA::GUIEventHandler { public:PickHandler() :_mx(0.0f), _my…...
模拟Spring源码思想,手写源码,理解注解
1、BeanDefinition package com.csdn.myspring; import lombok.AllArgsConstructor; import lombok.Data; Data AllArgsConstructor public class BeanDefinition {private String beanName;private Class beanClass; }2、扫描包的工具类MyTools package com.csdn.myspring; im…...
各种LLM数据集包括SFT数据集
各种LLM数据集包括SFT数据集 数集介绍和 hf上的名字对话数据生成方法交通领域数据集SFT 的解释数集介绍和 hf上的名字 通用预训练数据集 SFT datasets SFT 数据集 50万条中文ChatGPT指令Belle数据集:BelleGroup/train_0.5M_CN 100万条中文ChatGPT指令Belle数据集:BelleGrou…...
Sleuth
Sleuth 一 引言 随着服务的越来越多,对调⽤链的分析会越来越复杂。它们之间的调⽤关系也许如下图: 问题: 1:微服务之间的调⽤错综复杂,⽤户发送的请求经历那些服务,调⽤链不清楚,没有⼀ 个⾃…...
新手必看!!附源码!!STM32通用定时器输出PWM
一、什么是PWM? PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号࿰…...
静态文件鉴权
静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统,是对BXX受理业务的强力补充系统,他允许操作员拿着IPAD,和客户约定地点上门受理业务。 因一些业务的受理,按照最新的业务规章制度,需…...
计算机视觉与机器学习D1
计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有: 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…...
layui(2.8.18)生成验证码
<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>登入</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&quo…...
MAX/MSP SDK学习05:A_GIMME方法
今天终于将A_GIMME方法部分的描述看懂了,上周因为太赶时间加上这文档很抽象一直没看懂。也就那么一回事,记录一下。 A_GIMME方法用于接收多个参数。 ①内置消息选择器传递多个参数时一定要使用A_GIMME; ②自定义消息选择器传递多个参数时建…...
LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」
原文:LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 说明:LangServe代替 langchainserver 成为新的langchain 部署工具 官网资料:🦜️🏓 LangServe | &…...
mmdet全教程
官方给的文档一言难尽,网上的教程又没有从大纲到源码的完整解读,计划年后开个系列记录一下...
1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)
1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS) 1、时间:1992-2021年3月,其中1992-2013年为年度数据,2013-2021年3月为月度数据 2、来源:DMSP、VIIRS 3、范围:分区域汇总:…...
Guava的Retryer
Retryer类是Guava库中的一个重试工具类,它提供了一种在调用方法时自动重试的机制。Retryer类中的call()方法用于执行需要重试的方法,如果方法执行失败,则Retryer会根据配置的规则进行重试。Retryer类可以配置重试的次数、重试间隔时间、重试的…...
Docker实践笔记7:构建MySQL 8镜像
使用Docker构建MySQL 8镜像并运行容器 本教程将指导您使用Dockerfile构建和运行一个MySQL 8容器。让我们开始吧! 步骤1:创建Dockerfile 在您的项目根目录下创建一个名为Dockerfile的文件。以下是Dockerfile的示例内容: # 基于最新的MySQL…...
# 学习 Prolog 和 离散逻辑的16个等价公式:一趟有趣的逻辑之旅
Prolog 的语法很奇怪,需要一些时间来适应,所以我花了点时间,想用Prolot来学习和验证离散逻辑的16组等价公式。 1. 双重否定律 (Double Negation Law) A ⇔A 首先,我们来看看双重否定律。在 Prolog 中,我们可以这样验证它: fun1(A,Z):-memb…...
Win11+Modelsim SE-64 10.6d搭建UVM环境
1、添加源文件及tb文件 在目录下建立文件夹,将DUT和Testbench添加进去,文件夹内容如下所示: 2、以《UVM实战》中的例子做简单的示例: 2.1 设计文件 :dut.sv 功能很简单,即将接受到的数据原封不动发送出去…...
LeetCode(32)串联所有单词的子串【滑动窗口】【困难】(含图解)
目录 1.题目2.答案3.提交结果截图4.图解 链接: 串联所有单词的子串 1.题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 w…...
【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案
目录 一、问题背景: 二、实际示例: 三、解决方案: 1. Delphi 代码: 2. javaScript代码: 一、问题背景: 在用Delphi开发程序,无论是移动端还是PC端,都可以很方便的使用TWebBrows…...
04 if进阶
elif 否则如果 如果条件没有满足 会继续进入“否则如果”里面判断 只要满足一个条件 条件判断立即终止 chinese 100 if chinese 100:print("我们去迪士尼玩")elif chinese > 90:print("我们去朱雀森林公园")else:print("回家写作业")if n…...
2023全球数字贸易创新大赛9-12
目录 回答评委提问:先说痛点-再说怎样解决 食品安全溯源是否全流程 星火• 链网...
基于MCP协议构建安全可控的AI浏览器自动化工具
1. 项目概述:一个让AI安全“上网”的桥梁最近在折腾AI应用开发,特别是想让大语言模型(LLM)能像人一样操作浏览器,去获取实时信息、执行网页任务。这听起来很酷,但实际操作起来,安全性和可控性是…...
ExcelJS终极指南:JavaScript电子表格处理的完整解决方案
ExcelJS终极指南:JavaScript电子表格处理的完整解决方案 【免费下载链接】exceljs Excel Workbook Manager 项目地址: https://gitcode.com/gh_mirrors/ex/exceljs ExcelJS是一款功能强大的JavaScript电子表格处理库,它允许开发者在浏览器和Node.…...
3个步骤将Obsidian升级为智能知识助手:obsidian-copilot终极指南
3个步骤将Obsidian升级为智能知识助手:obsidian-copilot终极指南 【免费下载链接】obsidian-copilot THE Copilot in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-copilot 在信息过载的时代,我们每天处理海量笔记却难以高效提…...
揭秘QQ音乐格式锁:qmc-decoder解锁你的音乐自由之旅
揭秘QQ音乐格式锁:qmc-decoder解锁你的音乐自由之旅 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经在QQ音乐下载了心爱的歌曲,却发现这些…...
XA分布式事务
XA基本原理 在分布式数据库(如你正在研究的 TDSQL)中,XA 分布式事务是保证跨多个节点操作时数据“要么全成功,要么全回滚”的标准方案。它是一种基于强一致性的设计,在金融级场景中应用广泛。 1. 什么是 XA?…...
【Docker 27集群调度革命】:20年运维专家亲授7大核心算法升级路径与避坑指南
更多请点击: https://intelliparadigm.com 第一章:Docker 27集群调度革命的演进背景与核心价值 Docker 27 并非官方发布的版本号(Docker 当前稳定版为 26.x),但该命名象征性地指向一个关键拐点:当容器编排…...
替换背景颜色怎么操作?2026年最全免费工具推荐与详细教程
最近有很多粉丝问我:替换背景颜色怎么操作?特别是做电商、制作证件照、处理产品图的朋友,都在寻找一个既简单又好用的解决方案。今天我就把自己用过的所有工具和方法整理出来,手把手教你替换背景颜色,让你的图片瞬间变…...
2026届最火的十大AI辅助论文神器推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 智能应用的AI写作工具,是基于自然语言处理技术的,它能够辅助用户去高…...
3分钟解决Blender到Unity的FBX转换难题:新手必备插件指南
3分钟解决Blender到Unity的FBX转换难题:新手必备插件指南 【免费下载链接】blender-to-unity-fbx-exporter FBX exporter addon for Blender compatible with Unitys coordinate and scaling system. 项目地址: https://gitcode.com/gh_mirrors/bl/blender-to-uni…...
Balena Etcher终极指南:三步搞定系统镜像烧录,新手也能轻松上手
Balena Etcher终极指南:三步搞定系统镜像烧录,新手也能轻松上手 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾经为了给树莓派烧…...
