鼠标单击点在世界坐标系中的射线 计算原理

该博客介绍了如何计算鼠标点击在世界坐标系中的射线,涉及osgManipulator/Dragger.cpp的代码参考,通过窗口坐标、视图矩阵、投影矩阵和视口矩阵的逆运算找到Znear和Zfar的交点。并提供了使用osg库实现的示例代码,展示了一个实时显示视点坐标的HUD系统。
摘要由CSDN通过智能技术生成

鼠标单击点在世界坐标系中的射线 计算原理

参考osgManipulator/Dragger.cpp:

求鼠标单击射线在世界坐标系中Znear、Zfar的交点:

bool PointerInfo::projectWindowXYIntoObject(const osg::Vec2d& windowCoord, osg::Vec3d& nearPoint, osg::Vec3d& farPoint) const

{    nearPoint = osg::Vec3d(windowCoord.x(),windowCoord.y(),0.0)*_inverseMVPW;

    farPoint = osg::Vec3d(windowCoord.x(),windowCoord.y(),1.0)*_inverseMVPW;

    return true;

}

 

窗口坐标值(winxwiny,深度值) =世界坐标点 * 视图矩阵 * 投影矩阵 * 视口矩阵=V世界 * VM * PM * WM。故V世界=(winxwiny,深度值)* (VM * PM * WM)的逆

Znear对应的深度值为0Zfar对应的深度值为1,故:

Znear对应点坐标为(winxwiny0)* (VM * PM * WM)的逆,

Zfar对应点坐标为(winxwiny1)* (VM * PM * WM)的逆。

 

获取(VM * PM * WM)的逆的代码如下:

           osg::ref_ptr<osg::Camera> cameraMaster = viewer->getCamera();

           osg::Matrix mvpw = cameraMaster->getViewMatrix() * cameraMaster->getProjectionMatrix();

           if ( cameraMaster->getViewport()) mvpw.postMult( cameraMaster->getViewport()->computeWindowMatrix());

 

           osg::Matrix _inverseMVPW;

           _inverseMVPW.invert( mvpw);

 

参考代码如下:

/*OSG中的HUD实时显示视点坐标*/

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

#include <osg/Geode>

#include <osg/Depth>

#include <osg/CameraNode>

#include <osgText/Text>

#include <osgGA/TrackballManipulator>

#include <osg/LineWidth>

#include <osg/Point>

 

#include <iostream>

#include <sstream>

 

#pragma comment( lib, "osgd.lib"); //.在Debug版本下的库名都加d,如"osgd.lib"

#pragma comment( lib, "osgDBd.lib")

#pragma comment(

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值