我要发帖 回复

正式会员

1

主题

32

积分

0

专家分

:

私信
发表时间 : 2008-11-5 03:19:55 | 浏览 : 2712    评论 : 4
刚刚学习OpenGL,看到函数gluUnProject,想写一个程序用下,但总是实现不了,
想问下大家有没有关于这个函数的示例程序,麻烦跟帖回复下,谢谢了。

最近VR访客

tan_dunming 评论于2008-11-5 08:28:01
《OpenGL 2.0 精髓》书中有一个例程,网上可以搜索到电子书以及源代码的。

具体的应用可以参考下例,将屏幕坐标(mouseX, MouseY)转化为模型空间坐标。
注意:操作的时候应该点击屏幕中模型显示的地方,否则转化后的结果
//拾取操作,鼠标点的坐标保存在全局变量mouseX, MouseY
//在场景全部绘制完毕之后处理拾取,而且读取后缓冲,结果存放与ox, oy, oz中。
GLdouble ox = 0, oy = 0, oz = 0;
GLubyte mouseColor[3] = {0};
void ProcessPick(int mouseX, int mouseY)
{
        glReadBuffer(GL_BACK);

        GLint Viewport[4];
        glGetIntegerv(GL_VIEWPORT, Viewport);

        float fZValue = 0;
        glReadPixels(mouseX,Viewport[3]-mouseY,                   // 屏幕坐标
                1,1,                                              //宽高都为1,即只读一个象素
                GL_DEPTH_COMPONENT,                               //希望获得深度信息
                GL_FLOAT,                                         //浮点型
                &fZValue );                                       //获得值保存在fZValue中        得到一个0~1之间的数
        
        GLdouble ModelMatrix[16], ProjMatrix[16];
        glGetDoublev(GL_MODELVIEW_MATRIX, ModelMatrix);
        glGetDoublev(GL_PROJECTION_MATRIX, ProjMatrix);

        gluUnProject(mouseX, Viewport[3]-mouseY,
                fZValue, ModelMatrix, ProjMatrix, Viewport,
                &ox, &oy, &oz);


        glReadPixels(mouseX,Viewport[3]-mouseY,1, 1, GL_RGB,
                GL_UNSIGNED_BYTE, mouseColor);
}


仅供参考

[ 本帖最后由 tan_dunming 于 2008-11-5 08:29 AM 编辑 ]
追求卓越
krisdy 评论于2008-11-5 10:54:42
感谢版主的回答,可我在那本书中没找到例程啊。
我现在想实现的效果就是:用鼠标在窗口屏幕上左键点击,然后就可以以点击的点为原点画出一个立方体。
我的思路是,左键点击可以获得窗口坐标,然后转换成世界坐标,我把原点移到点击的点处,调用函数就可以画出立方体了。
但我总是实现不了。
谢谢楼主的帮忙了,或许这对你来说很容易,但对我很重要。
tan_dunming 评论于2008-11-5 11:24:30
书中的3.6. Selection 对应的源代码文件夹的目录为:OpenGL Distilled Code\SampleCode01\Picking
具体的书籍、源代码自己从网上或者图书馆查找吧。

窗口屏幕上的点映射到三维空间还有问题 即深度信息无法获取 ,3DMax建模也是需要三个视口才确定坐标的吧 否则存在二义性

不知道我的理解对不对 你自己好好研究研究
追求卓越
krisdy 评论于2008-11-6 09:57:18
谢谢版主的回答了

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-27 08:20 AM

返回顶部