屏幕坐标向OpenGL坐标转换的问题
2015-06-13 11:01
633 查看
搬运自我的百度空间
问题困扰我很久了,网上给出了这样一段代码:
voidTranslateGL(intx,inty,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY,winZ=10086;
glPushMatrix();
glLoadIdentity();
glTranslatef(0,0,-1.5);
// glRotatef(angx,1,0,0);
// glRotatef(angy,0,1,0);
// glRotatef(angz,0,0,1);
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = (float)x;
winY = viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ);
}
我发现最后没有成功返回X ,Y,Z坐标,调试后发现错在了glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );这一句上,返回的winZ永远是1.0
查阅无数次Google后,总算在一个外国论坛上看到,问题出在了近平面与远平面设置的问题。
gluPerspective(50,aspect,0,2);
这一句我把近平面设为0,而glReadPixels返回的winZ是某点在近远平面之间的比例,而可能由于除数是0(近平面)的缘故,返回的是无穷大(也就是1.0)
修改的办法就是gluPerspective(50,aspect,0.5,2);
还是要掌握好原理呀~
2013-06-26
屏幕坐标向OpenGL坐标转换的问题
搬运自我的百度空间问题困扰我很久了,网上给出了这样一段代码:
voidTranslateGL(intx,inty,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY,winZ=10086;
glPushMatrix();
glLoadIdentity();
glTranslatef(0,0,-1.5);
// glRotatef(angx,1,0,0);
// glRotatef(angy,0,1,0);
// glRotatef(angz,0,0,1);
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = (float)x;
winY = viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ);
}
我发现最后没有成功返回X ,Y,Z坐标,调试后发现错在了glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );这一句上,返回的winZ永远是1.0
查阅无数次Google后,总算在一个外国论坛上看到,问题出在了近平面与远平面设置的问题。
gluPerspective(50,aspect,0,2);
这一句我把近平面设为0,而glReadPixels返回的winZ是某点在近远平面之间的比例,而可能由于除数是0(近平面)的缘故,返回的是无穷大(也就是1.0)
修改的办法就是gluPerspective(50,aspect,0.5,2);
还是要掌握好原理呀~
2013-06-26
相关文章推荐
- Linux 性能优化程序
- 在iptables和selinux中放行smb服务
- Linux samba服务器设置简单匿名共享
- Linux 性能测试程序
- Linux 性能监控程序
- 修改SELinux设置,使vsftp在enforcing security enhance模式下正常运行
- linux线程池设计讲解
- CentOS6/RedHat6安装kernel-xen重启后报scsi_wait_scan错误的解决
- OpenCL快速入门教程
- SOA面向服务架构的一些思考
- opencv
- Linux的任务调度Crontab
- nginx实现负载均衡
- 转变思维--使用Python生成Shell命令,批量执行程序
- Java远程执行Linux命令
- Opencv的配置
- Linux注意到Makefile
- VMware虚拟机上安装linux和克隆
- CentOS 5.5 Samba服务器安装总结
- Centos 5.5下安装samba