//屏幕转世界
osg::Vec3d screenPos = osg::Vec3d(p.x(), p.y(), 0.5);
osg::Camera* pCamera = pViewer->getCamera();
osg::Matrix VPW = pCamera->getViewMatrix() * pCamera->getProjectMatrix() * pCamera->getViewport()->computeWindowMatrix();
osg::Matrix inverseVPW = osg::Matrix::inverse(VPW);
osg::Vec3d worldPos = screenPos * inverseVPW;
//构建平面法线
osg::BoundingBox bbox = root->getBoundingBox();//with your own
osg::Vec3 p0 = osg::Vec3(bbox.xMin(), bbox.yMin(), bbox.zMin());
osg::Vec3 p1 = osg::Vec3(bbox.xMax(), bbox.yMin(), bbox.zMin());
osg::Vec3 p2 = osg::Vec3(bbox.xMin(), bbox.yMax(), bbox.zMin());
osg::Vec3 p0p1 = p0 - p1;
osg::Vec3 p1p2 = p1 - p2;
osg::Vec3 normal = p0p1 ^ p1p2;
normal.normalize();
osg::Matrix viewMatrix = pCamera->getViewMatrix();
osg::Vec3d eye, center, up;
viewMatrix.getLookAt(eye, center, up);
//投影到底面xoy的投影点
double x1, y1, z1;
dooble t;
double dividend = (normal.x()*p0.x()+normal.y()*p0.y()+normal.z()*p0.z()-(normal.x()*worldPos.x()+normal.y()*worldPos.y()+normal.z()*worldPos.z()));
double divisor = pow(normal.x(), 2)+pow(normal.y(),2)+pow(normal.z(), 2);
t = dividend / divisor;
x1 = worldPos.x()+normal.x()*t;
y1 = worldPos.y()+normal.y()*t;
z1 = worldPos.z()+normal.z()*t;
osg::Vec3 projectPlanePt = osg::Vec3d(x1, y1, z1);
//金子般的代码 世界坐标转换到xoy平面
double length = (worldPos - eye).length();
float h2 = 0.0 - eye.z();
float h1 = worldPos.z() - eye.z();
osg::Vec3 dir = worldPos - eye;
dir.z() = 0.0;
dir.normalize();
float d1 = std::sqrt(1-(h1/length)*(h1/length))*length;
float d2 = d1 * h2 / h1;
osg::Vec3 planePt = eye + dir * d2;
planePt.z() = 0.0;
