懂视

osgearth屏幕坐标定义

2024-11-04 02:33:27

osgearth屏幕坐标定义?

#defineM(row,col)m

voidTransform_Point(doubleout,constdoublem,constdoublein){

out=M(0,0)*in+M(0,1)*in+M(0,2)*in+M(0,3)*in;

out=M(1,0)*in+M(1,1)*in+M(1,2)*in+M(1,3)*in;

out=M(2,0)*in+M(2,1)*in+M(2,2)*in+M(2,3)*in;

out=M(3,0)*in+M(3,1)*in+M(3,2)*in+M(3,3)*in;

}

osg::Vec3dWorldToScreen(osgViewer::View*view,osg::Vec3worldpoint){

doublein,out;

in=worldpoint._v;

in=worldpoint._v;

in=worldpoint._v;

in=1.0;

//获得当前的投影矩阵和模型视图矩阵

osg::MatrixprojectMatrix=view->getCamera()->getProjectionMatrix();

osg::MatrixviewprojectMatrix=view->getCamera()->getViewMatrix();

//下面计算模型视图矩阵*投影矩阵*视口窗口变换矩阵

doublemodelViewMatrix;

memcpy(modelViewMatrix,viewprojectMatrix.ptr(),sizeof(GLdouble)*16);

Transform_Point(out,modelViewMatrix,in);

doublemyprojectMatrix;

memcpy(myprojectMatrix,projectMatrix.ptr(),sizeof(GLdouble)*16);

Transform_Point(in,myprojectMatrix,out);

if(int(in*100000)==0){

returnosg::Vec3d(0,0,0);

}

in/=in;

in/=in;

in/=in;

intviewPort;

osg::Viewport*myviewPort=view->getCamera()->getViewport();

viewPort=0;

viewPort=0;

viewPort=mConfigure->GetScreenWidthPixel();//横向象素点

viewPort=mConfigure->GetScreenHeightPixel();//纵向象素点

//计算三维点在屏幕上的二维投影点

osg::Vec3dsceenPoint;

sceenPoint._v=(int)(viewPort+(1+in)*viewPort/2+0.5);

sceenPoint._v=(int)(viewPort+(1+in)*viewPort/2+0.5);

sceenPoint._v=0;

returnsceenPoint;

}