首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

问个老有关问题,屏幕坐标转化OpenGl世界坐标

2012-02-19 
问个老问题,屏幕坐标转化OpenGl世界坐标?刚才我试过 zhangci226 的一段代码:但是得不到实际坐标,不知道哪

问个老问题,屏幕坐标转化OpenGl世界坐标?
刚才我试过 zhangci226 的一段代码:但是得不到实际坐标,不知道哪里出问题了?

CPoint pTemp;
::GetCursorPos(&pTemp); //当前鼠标点

调用下面的函数:
GetSelectionRay(pTemp.x,pTemp.y); 

得到的坐标不对,并不是我转到3D图形中地面上一点。
void OpenGL::GetSelectionRay(int mouse_x, int mouse_y)
{
GLint viewport[4]; 
GLdouble modelview[16]; 
GLdouble projection[16]; 
GLfloat winX, winY, winZ; 
GLdouble posX, posY, posZ; 

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

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

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

Point3f[0] = posX;
Point3f[1] = 0.1; //略高于地面上一点
Point3f[2] = posZ;
}



[解决办法]
Point3f[0] = posX; 
Point3f[1] = 0.1; //略高于地面上一点 
Point3f[2] = posZ;

这里,y值设置是错误的

应为这里得到的posX,posY,posZ,是经过了透视变换的值,如果你直接给一个0.1,这个值是没有经过透视变换的,所以不正确
[解决办法]
或者说你在GetSelectionRay()中按这个顺序调用,这样获得的坐标为世界坐标。

C/C++ code
glMatrixMode(GL_MODEVIEW);glIdentity();gluLookAt();glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 

热点排行