在3D世界中,通过鼠标拾取拖拽物体是一个神奇事情,它的具体实现方法如下:
- 将鼠标点击视口的二维坐标转换成3D世界中的三维坐标。
- 视点出发到鼠标点击位置的可形成一条射线,在场景节点树上遍历,查找与射线相交的节点。
- 获得拾取节点与视点之间距离,从而计算得到鼠标释放时拾取节点的位置,平移拾取节点到目标位置。
2D坐标转3D坐标参考
1 | osg::Vec3 screenToWorld(osgViewer::Viewer* viewer,double dx,double dy) |
获取拾取节点代码参考
1 | //参数说明:firstPos:是当前摄像机的位置。endPos:为偏移坐标值,eye + curRayLineDir*100 |
拖拽物体参考
1 | //我是在osgGA::GUIEventAdapter::DRAG进行拖拽的功能 |
参考链接
- OSG实现鼠标拖拽物体,by 码农家园.
- OSG拾取对应的实体,by 成魔的羔羊.