屏幕坐标转化为世界坐标(vc opengl)

来源:互联网 发布:小米快传软件 编辑:程序博客网 时间:2024/05/20 21:59
 

Point3D CSideView::TurnGLpoint(CPoint Tpoint)
{
 Point3D Rp;
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX,winY,winZ;
    GLdouble posX,posY,posZ;

 
    glGetIntegerv(GL_VIEWPORT,viewport);
    glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
    glGetDoublev(GL_PROJECTION_MATRIX,projection);


    winX=(float)Tpoint.x;
    winY=viewport[3]-(float)Tpoint.y;

    glReadPixels((int)winX,(int)winY,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&winZ);//获取鼠标屏幕坐标处像素的深度Z
    gluUnProject(winX,winY,winZ,modelview,projection,viewport,&posX,&posY,&posZ);
   
    Rp.x=posX;
    Rp.y=posY;
    Rp.z=posZ;

    return Rp;

}

Point3D为自己写的一个结构体,可以根据自己需要写。

直接调用该函数:

p3d=TurnGLpoint(p);



补充Webgl,三维转化为屏幕坐标方法:

  function toScreenPosition(point, camera)
{
var pos=point.clone();
projScreenMat=new THREE.Matrix4();

projScreenMat.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
pos.applyProjection(projScreenMat);

return { x: ( pos.x + 1 ) * window.innerWidth / 2,
y: ( - pos.y + 1) * window.innerHeight / 2 };

}; 

原创粉丝点击