博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
osg点选pick物体
阅读量:6715 次
发布时间:2019-06-25

本文共 2289 字,大约阅读时间需要 7 分钟。

osg已经实现了通过屏幕坐标直接与物体求交的方法。
能得到pick的物体,也能得到坐标。
我希望点击大地形,根据点击的点画出直线。
屏幕坐标与世界坐标的转换都会了,随后实现这个功能。
#pragma once
#include <osgGA/GUIEventHandler>
#include <osgUtil/LineSegmentIntersector>
#include <osgViewer/Viewer>
class CPickHandler : 
public osgGA::GUIEventHandler
{
public:
    CPickHandler(osgViewer::Viewer *viewer);
    ~CPickHandler(
void);
    osgViewer::Viewer *m_pViewer;
    
virtual 
bool handle(
const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
    
void pick(
float fX,
float fY);
};
#include 
"
StdAfx.h
"
#include 
"
PickHandler.h
"
CPickHandler::CPickHandler(osgViewer::Viewer *viewer):m_pViewer(viewer)
{
}
CPickHandler::~CPickHandler(
void)
{
}
bool CPickHandler::handle( 
const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa )
{
    
switch (ea.getEventType())
    {
    
case(osgGA::GUIEventAdapter::PUSH):
        {
            
if (ea.getButton() == 
1)
            {
                pick(ea.getX(),ea.getY());
            }
            
return 
true;
        }
    }
    
return 
false;
}
void CPickHandler::pick( 
float fX,
float fY )
{
    osgUtil::LineSegmentIntersector::Intersections intersections;
    
if (m_pViewer->computeIntersections(fX,fY,intersections))
    {
        
for (auto itr=intersections.begin();itr!=intersections.end();++itr)
        {
            
if (!itr->nodePath.empty())
            {
                
const osg::NodePath& np = itr->nodePath;
                
for (
int i=np.size()-
1;i>=
0;--i)
                {
                    osg::ref_ptr<osg::Node> node = dynamic_cast<osg::Node *>(np[i]);
                    
if (NULL != node && node->getName().compare(
"
cow
") == 
0)
                    {
                        node->setNodeMask(
0);
                        
//
itr->getWorldIntersectPoint();
//
得到坐标
                    }
                }
            }
        }
    }
}
屏幕坐标与世界坐标转换
osg::Vec3 DrawCallback::getPoint()
{
    osg::Vec3 vec3;
    osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer *>(m_pAA);
    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();
    osgViewer::Renderer *render = dynamic_cast<osgViewer::Renderer *>(camera->getRenderer());
    osgUtil::SceneView *sceneView = render->getSceneView(
0);
    osg::Vec3 vScreen(m_pEA->getX(),m_pEA->getY(),
0);
    osg::Vec3 window;
    sceneView->projectWindowIntoObject(vScreen,window);
    osg::Matrix mVPW = camera->getViewMatrix() * camera->getProjectionMatrix() * camera->getViewport()->computeWindowMatrix();
    osg::Matrix invertVPW;
    invertVPW.invert(mVPW);
    vec3 = window * invertVPW;
    
return vec3;
}
1.配置MD
2.配置x64
3.找到mfc example
4.写callback
5.创建一个节点挂到根节点下,为这个节点设置一个回调器。
响应事件改变节点。
url:

转载于:https://www.cnblogs.com/greatverve/archive/2013/04/21/osg-pick.html

你可能感兴趣的文章
Javascript中进行遍历操作的所有方法
查看>>
JS的原型链和继承
查看>>
python中pyquery无法获取标签名的dom节点
查看>>
面试官:请手写一个webpack4.0配置
查看>>
有关getter 和 setter的使用
查看>>
JavaScript面向对象中的Function类型个人分享
查看>>
记录一次Webpack插件优化的经历
查看>>
【跃迁之路】【505天】程序员高效学习方法论探索系列(实验阶段262-2018.06.25)...
查看>>
ubuntu16.04 搭建java 环境
查看>>
关于 try 和 finally 中的 return
查看>>
JS 1-数据类型
查看>>
(Google I/O '17) Speeding Up Your Android Gradle Builds 在本地的实践
查看>>
最大似然法与似然函数
查看>>
SAPGUI里实现自定义的语法检查
查看>>
快速创建 HTML5 Canvas 电信网络拓扑图
查看>>
JS动画之定时器详解
查看>>
利用Tomcat发布基于Maven所构建的Jersey RESTful Web Service
查看>>
PHP之string之wordwrap()函数使用
查看>>
ABAP OPEN SQL里OPEN CURSOR和SELECT的比较
查看>>
【348天】我爱刷题系列107(2018.01.19)
查看>>