Win窗口坐标二维坐标与OpenGl的世界坐标系的转换

  几何处理管线擅长于使用视图和投影矩阵以及用于裁剪的视口把顶点的世界坐标变换为窗口坐标.

这个屏幕位置源于三维空间的什么地方.

1. 首先明白Win环境的窗口二维坐标系表示

  即,Win的屏幕坐标的坐标系表示如下:左上为坐标系原点,正右为X轴正方向, 正下方为Y轴正方向。

  关于Win的绘图区坐标问题,简要理解为,在视图类的窗口去如下图所示;如果是FrameWork的绘图区,则需要包含工具栏和状态栏的区域,二者是不一样的。

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_屏幕坐标

       

世界坐标系转换到相机坐标python 世界坐标系怎么转换_世界坐标系_02

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_二维_03

2. 在了解一下Opengl的视口坐标系

  Opengl设置视口操作如下:


glViewport(0,0,m_wide,m_heigth);

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_二维_04

3. 关于opengl的世界坐标系,用户坐标系,模型坐标系可以查看博客

  

4. 屏幕坐标到opengl世界坐标转换

  整个过程如下:详细讲解可以参考如下博客:

  

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_世界坐标系转换到相机坐标python_05

5. 程序实例读取从View窗口坐标,获取世界坐标系的坐标


GLint    viewport[4]; 
 GLdouble modelview[16]; 
 GLdouble projection[16]; 
 GLfloat  winX, winY, winZ; 
 GLdouble posX, posY, posZ; 

 glPushMatrix();
 
 // 变换要绘图函数里的顺序一样,否则坐标转换会产生错误
 glScalef(m_srtMatrix[0], m_srtMatrix[1], m_srtMatrix[2]); // 缩放、平移、旋转变换
 glRotatef(m_srtMatrix[3], 1.0f, 0.0f, 0.0f);
 glRotatef(m_srtMatrix[4], 0.0f, 1.0f, 0.0f);
 glRotatef(m_srtMatrix[5], 0.0f, 0.0f, 1.0f);
 glTranslatef(m_srtMatrix[6], m_srtMatrix[7], m_srtMatrix[8]);


 glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
 glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
 glGetDoublev(GL_PROJECTION_MATRIX, projection); 

 glPopMatrix();

 winX = x; 
 winY = screenHeight - y;
 glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); 
 gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
  
 posX, posY, posZ,即为世界坐标系的坐标


   (1)viewport就是视口的大小 : 左下点x,左下点y, 宽度, 高度

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_屏幕坐标_06

modelview就是一个4*4的矩阵,并且以列优先排序, 其中如下是单位矩阵+ 视点位置 -20;

  

世界坐标系转换到相机坐标python 世界坐标系怎么转换_二维_07

 

6. 实现从世界坐标系获取到View平面坐标(像素)信息

  其中,worldPox是世界坐标系中的点,winPox是窗口坐标系的点,需要注意的是,获取的窗口坐标是以左下点为原点。


inline void CScanLineSeedFill::getViewPortCoordPos(GLfloat (&p_worldPox)[4][3], GLdouble (&p_winPox)[4][3])
{
    for (int i=0; i<4; i++)
    {
        gluProject(p_worldPox[i][0], p_worldPox[i][1], p_worldPox[i][2], 
            modelview, projection, viewport, 
            &p_winPox[i][0], &p_winPox[i][1], &p_winPox[i][2]);
    }
}


  其中“模型视图矩阵”“投影矩阵”“视口矩阵”信息通过以下程序获取


//框架颜色
    glPushMatrix();
    GLint    viewport[4]; 
    GLdouble modelview[16]; 
    GLdouble projection[16]; 
    glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
    glGetDoublev(GL_PROJECTION_MATRIX, projection); 
    glPopMatrix();