吐槽墙制作图片:屏幕坐标向OpenGL坐标转换的问题

来源:百度文库 编辑:高校问答 时间:2024/05/09 19:57:05
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
POINT3D pot3d;

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

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
}

这些代码是将屏幕坐标转换为OpenGL坐标系里的坐标,我发现在进行平移缩放之后,就不能准确计算了。比如屏幕坐标(200,200),转换为OpenGL坐标为(-96.27,6.83),进行平移缩放之后,(200,200)还是转换为(-96.27,6.83),这是怎么回事,如何修改?
下面是绘图和设置变换矩阵的代码。
glPushMatrix();
glViewport(m_x, m_y, m_width, m_height);
glScalef(m_srtMatrix[0], m_srtMatrix[1], m_srtMatrix[2]);
glTranslatef(m_srtMatrix[6] / m_srtMatrix[0],m_srtMatrix[7] / m_srtMatrix[1], m_srtMatrix[8] / 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);

/////////////////////// 图形绘制 /////////////////////////////////////////
CMainFrame* pMF = (CMainFrame*)AfxGetMainWnd();
CTestOpenGLDoc* pDoc = (CTestOpenGLDoc*)pMF->GetActiveDocument();
pDoc->m_objManager.Draw();
/////////////////////////////////////////////////////////////////////////

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (m_aspect <= 1)
glOrtho(-100, 100, -100 / m_aspect,100 / m_aspect, -100, 100);
else
glOrtho(-100* m_aspect, 100 * m_aspect, -100, 100, -100, 100);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFlush();
glPopMatrix();

建议你去买本opengl的红宝书,这种问题得到回答的概率太小了,因为专业指向性太强,非专业图形学的程序员在写opengl的时候都是要翻着书来做的,让大家直接就来回答这个问题有些难度,那本红宝书讲的还是很仔细的