屏幕坐标转换场景坐标并进行物体检测

在 OpenSceneGraph 中,要将屏幕坐标转换为当前场景坐标,并过滤出屏幕显示范围内的节点,可以通过以下步骤实现:

  1. 获取屏幕坐标: 当用户点击或交互时,获取鼠标点击的屏幕坐标。

  2. 转换屏幕坐标为世界坐标: 使用视图矩阵和投影矩阵将屏幕坐标转换为世界坐标。

  3. 进行节点遍历和过滤: 遍历场景中的节点,根据节点的世界坐标和屏幕空间边界进行筛选,以确定哪些节点位于屏幕范围内。

以下是一个基本示例代码,展示了如何在 OpenSceneGraph 中实现屏幕坐标到当前场景坐标的转换,并过滤出屏幕显示范围内的节点:

#include <osgViewer/Viewer>
#include <osgGA/GUIEventHandler>
#include <osgUtil/LineSegmentIntersector>
#include <iostream>class PickHandler : public osgGA::GUIEventHandler {
public:virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) {if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH) {float x = ea.getX();float y = ea.getY();osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);if (view) {osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector =new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, x, y);osgUtil::IntersectionVisitor iv(intersector.get());view->getCamera()->accept(iv);if (intersector->containsIntersections()) {for (auto& intersection : intersector->getIntersections()) {osg::NodePath& nodePath = intersection.nodePath;osg::Node* node = (nodePath.size() >= 1) ? nodePath.back() : nullptr;if (node && isNodeInViewport(view, node, intersection.getWorldIntersectPoint())) {std::cout << "Selected Node: " << node->getName() << std::endl;}}}}}return false;}bool isNodeInViewport(osgViewer::View* view, osg::Node* node, const osg::Vec3& worldPos) {osg::Vec3 screenPos;if (view->computeIntersections(worldPos, osg::Vec3(0, 0, -1), screenPos)) {osg::Viewport* viewport = view->getCamera()->getViewport();if (viewport) {return (screenPos.x() >= 0 && screenPos.x() <= viewport->width()) &&(screenPos.y() >= 0 && screenPos.y() <= viewport->height());}}return false;}
};int main() {osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("path/to/your/model.obj");osgViewer::Viewer viewer;viewer.setSceneData(loadedModel.get());viewer.addEventHandler(new PickHandler());return viewer.run();
}

isNodeInViewport 函数用于检查节点是否在当前视口范围内。它通过将世界坐标转换为屏幕坐标,并检查是否在视口内来判断节点是否在屏幕范围内。

这个有个容易犯错的问题,就是语言描述是计算机屏幕范围内,导致开发者想通过屏幕坐标去过滤,但是在空间没有物体进行碰撞检测的情况下,不好实现,所以逆过来求解:检查节点是否在当前视口范围内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux上通过SSL/TLS和start tls连接到LDAP服务器

一&#xff0c;大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书&#xff0c;服务器证书&#xff0c;因为SSL/TLS&#xff0c;start tls都属于机密通信&#xff0c;需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…

一点DETR学习

DETR: 主要是为了学习query。 主要从两个方面&#xff1a;加偏好和缩短序列长度

〖大前端 - 基础入门三大核心之JS篇㊶〗- DOM事件传播和事件监听方法addEventListener()

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

ABAP调用Https接口 Ssl证书导入

ABAP调用Https接口 Ssl证书导入 一、证书导入 谷歌浏览器打开对方系统URL地址&#xff0c;下载SSL Server certificate,步骤如下&#xff1a; 浏览器打开要导出certificate(证书)的网站&#xff0c;点击这个小锁的图标&#xff1a; 点击连接是安全的后面小播放按钮 点击证…

Spark RDD、DataFrame和Dataset的区别和联系

一、三种数据介绍 是Spark中的三种不同的数据结构&#xff0c;它们都可以用于分布式数据处理&#xff0c;但是它们的实现方式和使用方法略有不同。 RDD&#xff08;弹性分布式数据集&#xff09; RDD是Spark最初的核心数据结构&#xff0c;它是一个分布式的、只读的、可容错的…

BIND DNS服务器的域名日志

BIND DNS服务器的域名日志 解析字段包括以下几个部分&#xff1a; 日期和时间&#xff1a;记录查询发生的日期和时间。客户端IP地址&#xff1a;发起查询的客户端IP地址。查询类型&#xff1a;查询的记录类型&#xff0c;如A、AAAA、MX、NS等。查询域名&#xff1a;被查询的域…

系列七、ThreadLocal为什么会导致内存泄漏

一、ThreadLocal为什么会导致内存泄露 1.1、ThreadLocalMap的基本结构 ThreadLocalMap是ThreadLocal的内部类&#xff0c;没有实现Map接口&#xff0c;用独立的方式实现了Map的功能&#xff0c;其内部的Entry也是独立实现的。源码如下&#xff1a; 1.2、ThreadLocal引用示意图…

educoder中Hive -- 索引和动态分区调整

第1关:Hive -- 索引 ---创建mydb数据库 create database if not exists mydb; ---使用mydb数据库 use mydb; ---------- Begin ---------- ---创建staff表 create table staff( id int, name string, sex string) row format delimited fields terminated by , stored…

分享一篇很就以前的文档-VMware Vsphere菜鸟篇

PS&#xff1a;由于内容是很久以前做的记录&#xff0c;在整理过程中发现了一些问题&#xff0c;简单修改后分享给大家。首先ESXI节点和win7均运行在VMware Workstation上面&#xff0c;属于是最底层&#xff0c;而新创建的CentOS则是嵌套后创建的操作系统&#xff0c;这点希望…

MySQL--慢查询(一)

1. 查看慢查询日志是否开启 show variables like slow_query%; show variables like slow_query_log; 参数说明&#xff1a; 1、slow_query_log&#xff1a;这个参数设置为ON&#xff0c;可以捕获执行时间超过一定数值的SQL语句。 2、long_query_time&#xff1a;当SQL语句执行…

CST同轴馈电步骤

CST同轴馈电步骤 算例1. 同轴内芯2. 填充材料3. 外皮4. GND减去一个圆形&#xff0c;使EMWAVE可以通过5. 添加端口6. 结果比较 算例 cst模型库中的一个圆贴片 1. 同轴内芯 2. 填充材料 他这里直接使用和介质基板一样的材料并且进行了合并&#xff0c;我就懒得再改了&#x…

java代码调用twitter-api用例实战

一、申请twitter开发者账号 首先先申请twitter开发者免费的API&#xff0c;要填写申请的内容&#xff0c;放心大胆地写&#xff0c;申请完&#xff0c;会提供免费的API接口。 以下是我申请到的三个免费API 申请完开始进行测试调用。 读官方文档账户认证那块&#xff1a;https…

《安富莱嵌入式周报》第327期:Cortex-A7所有外设单片机玩法LL/HAL库全面上线,分享三款GUI, PX5 RTOS推出网络协议栈,小米Vela开源

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 1、2023 Hackaday大赛胸牌开源 Vectorscope-main.zip (66.83MB) GitHub - Hack-a-Day/Vectorscope: Vectorscope badg…

Baidu Comate 基于百度文心一言的智能编码助手

本心、输入输出、结果 文章目录 Baidu Comate 基于百度文心一言的智能编码助手前言产品能力主要功能特性JetBrains IntelliJ IDEA 插件安装相关链接花有重开日,人无再少年实践是检验真理的唯一标准Baidu Comate 基于百度文心一言的智能编码助手 编辑:简简单单 Online zuozuo …

git commit message 书写规范

在使用 Git 提交时&#xff0c;遵循良好的提交消息规范可以提高代码的可读性和可维护性。以下是一些常见的 Git 提交消息书写规范&#xff1a; 提交消息格式&#xff1a;一个提交消息通常包含三个部分&#xff1a;标题、空行和正文。它们之间使用空行分隔。 复制 <标题>&…

vue3项目中使用富文本编辑器

前言 适配 Vue3 的富文本插件不多&#xff0c;我看了很多插件官网&#xff0c;也有很多写的非常棒的&#xff0c;有UI非常优雅让人耳目一新的&#xff0c;也有功能非常全面的。 如&#xff1a; Quill&#xff0c;简单易用&#xff0c;功能全面。editorjs&#xff0c;UI极其优…

echarts的横向柱状图文字省略,鼠标移入显示内容 vue3

效果图 文字省略 提示 如果是在x轴上的&#xff0c;就在x轴上添加triggerEvent: true,如果是y轴就在y轴添加&#xff0c;我是在y轴上添加的 并且自定义的方法&#xff08;我取名为extension&#xff09; // echarts 横向省略文字 鼠标移入显示内容 export const extension…

AT89S52单片机的最小应用系统

目录 ​一.时钟电路设计 1.内部时钟方式 2.外部时钟方式 3.时钟信号的输出 二.机器周期&#xff0c;指令周期与指令时序 1.时钟周期 2.机器周期 3.指令周期 三.复位操作和复位电路 1.复位操作 2 复位电路设计 四.低功耗节电模式 AT89S52本身片内有8KB闪烁存储器&am…

Redisson分布式锁源码解析

一、使用Redisson步骤 Redisson各个锁基本所用Redisson各个锁基本所用Redisson各个锁基本所用 二、源码解析 lock锁 1&#xff09; 基本思想&#xff1a; lock有两种方法 一种是空参 另一种是带参 * 空参方法&#xff1a;会默认调用看门狗的过期时间30*1000&…

kubernetes|云原生|Deployment does not have minimum availability 的解决方案(资源隐藏的由来)

前言&#xff1a; 最近在部署prometheus的过程中遇到的这个问题&#xff0c;感觉比较的经典&#xff0c;有必要记录一下。 现象是部署prometheus主服务的时候&#xff0c;看不到pod&#xff0c;只能看到deployment&#xff0c;由于慌乱&#xff0c;一度以为是集群有毛病了&am…