关于一个屏幕坐标转换为世界坐标的一个特殊问题。
我看了很多屏幕坐标转换为世界坐标的描述。也用过下列这段代码。
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)x;
winY = (float)viewport[3] - (float)y;
glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
winZ = 1;
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
可是我一直都想不到我得到的结果。(简单来说,当y接近于0的时候,我可以得到我想要的结果。)
事实上小弟在做一个粒子系统,也就是particle system。我想做到的就是形成鼠标和屏幕的互动。(好吧,这也是小弟第一次写opengl代码。很多原理暂且不懂。。只是时间紧迫,也没法参详了。。咳咳)
我的具体问题是这样的:
其实我想做到的,和真正的屏幕坐标转换为世界坐标可能有些不太一样。
我想做到的是。我已知一个坐标平面z=-5.0,我要做到的是,屏幕坐标和这个平面上的坐标的切换。
也就是我点击屏幕,我获得的坐标是x=x0,y=y0,z=-5这样一个结果。
我的几个初始化函数是这样的:
void initRendering()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_DEPTH);
}
void handleResize(int w,int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(double)w/(double)h,1.0,200.0);
}
下面是在drawscene里面的一些参数设置。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPointSize(2.0f);
glPushMatrix();
glScalef(1,1,1);
glTranslatef(e->currentpos.x, e->currentpos.y, e->currentpos.z);
glRotatef(0, 0.0f, 0.0f, 1.0f);
glRotatef(0, 0.0f, 1.0f, 0.0f);
glRotatef(0, 1.0f, 0.0f, 0.0f);
急需求救!望高手解围!!非常感谢大家……
[解决办法]
不知到楼主参考过我blog中的文章没有
先弄清楚gl的图形管线
http://blog.csdn.net/zhangci226/archive/2010/02/21/5314184.aspx
然后可以使用ray picking来实现屏幕坐标到世界坐标的转换http://blog.csdn.net/zhangci226/archive/2010/03/19/5396986.aspx