OSG物体随鼠标移动(即点移动)
一.流程图:
二.点移动过程详解:
如下图所示:
可让物体移动平面D与显示器窗口平面M平行.
鼠标只在显示器窗口M上移动,当鼠标点到A点时,会看到物体的A’点被选中,当鼠标点从A移动到B时,实际的物体的移动也是只有平面D,此时对应物体实际点就为D平面上的B’.其中AB与A’B’两线是平行的.其实这归根到底还是基本的视锥体问题.平面D可由点A’和该平面的法线n确定:A’可由pointer.getLocalIntersectPoint()获得,是世界坐标系;n即为视线方向: pointer.getEyeDir().然后设置拖动的投影面为平面D即可,表示物体在平面D内移动: _projector->setPlane( *pplnPTPush);.
代码如下:
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgManipulator/Command>
#include <osgManipulator/CommandManager>
#include <osgManipulator/Translate2DDragger>
#include <osgText/Text>
#include <iostream>
#include <string>
#include <osg/ShapeDrawable>
#pragma comment( lib, "osgd.lib"); //此库用于Debug版本下
#pragma comment( lib, "osgDBd.lib");
#pragma comment( lib, "osgViewerd.lib");
#pragma comment( lib, "osgmanipulatord.lib");
#pragma comment( lib, "osgTextd.lib");
#pragma comment( lib, "osgGAd.lib");
using namespace std;
using namespace osgManipulator;
osg::ref_ptr< osg::Group > g_pRoot= new osg::Group();
class CDraggerPoint: public osgManipulator::Translate2DDragger
{
public:
void setupDefaultGeometry()
{
osg::ref_ptr< osg::Geometry > pGeom= new osg::Geometry();
osg::ref_ptr< osg::Geode > pGeoSphere= new osg::Geode();
osg::ref_ptr< osg::Vec3Array > pVertices= new osg::Vec3Array( 3);
int t= 2;
(*pVertices)[ 0].set( 0, 0+ t, 0);
(*pVertices)[ 1].set( 0, 0+ t, -2);
(*pVertices)[ 2].set( 2, 0+ t, 0);
pGeom->setVertexArray( pVertices.get() );
osg::ref_ptr< osg::DrawElementsUInt> pTri= new osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES , 0);