屏幕坐標轉換場景坐標并進行物體檢測

在 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.pswp.cn/news/161645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161645.shtml
英文地址,請注明出處:http://en.pswp.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…