网上的代码大部分是这样的:
1 auto matViewMatrix = camera->getViewMatrix(); 2 auto matProjectionMatrix = camera->getProjectionMatrix(); 3 auto wndMatrix = camera->getViewport()->computeWindowMatrix(); 4 osg::Matrix MVPW = matViewMatrix * matProjectionMatrix * wndMatrix; 5 osg::Matrix inverseMVPW = osg::Matrix::inverse(MVPW); 6 osg::Vec3 mouseWorld = osg::Vec3(x,y, 0) * inverseMVPW;
在和QT结合的开发的时候,发现这个位置是错误的,因为是鼠标获取的坐标的原点是左上角,而OSG的世界坐标系的原点是左下角,所以要把鼠标的Y值做转换。
像下面这样的:
1 void GraphicsWinQt::mouseMoveEvent( QMouseEvent *event ) 2 { 3 setKeyboardModifiers( event ); 4 this->getEventQueue()->mouseMotion(event->x(), event->y()); 5 if(nullptr != m_pMainWnd) 6 { 7 auto x = event->x(); 8 auto y = event->y(); 9 int iWindowHeight = this->height(); 10 //坐标值转换 11 y = iWindowHeight - y; 12 int z = 0; 13 osg::Camera* camera = m_pViewer->getCamera(); 14 15 auto matViewMatrix = camera->getViewMatrix(); 16 auto matProjectionMatrix = camera->getProjectionMatrix(); 17 auto wndMatrix = camera->getViewport()->computeWindowMatrix(); 18 osg::Matrix MVPW = matViewMatrix * matProjectionMatrix * wndMatrix; 19 osg::Matrix inverseMVPW = osg::Matrix::inverse(MVPW); 20 osg::Vec3 mouseWorld = osg::Vec3(x,y, 0) * inverseMVPW; 21 22 auto s = QStringLiteral("当前位置:"); 23 s += QString("%1,%2,%3").arg(mouseWorld.x()).arg(mouseWorld.y()).arg(mouseWorld.z()); 24 auto pEvent = MessageEvent::CreateInstance(1); 25 pEvent->m_sMsg = s; 26 qApp->postEvent(m_pMainWnd, pEvent); 27 } 28 }
另外OSG的向量是行向量所以是左乘
来源:https://www.cnblogs.com/bingbingzhe/p/12185372.html