游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7138|回复: 6

关于 gluUnProject 的问题

[复制链接]

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2007-2-7 11:44:00 | 显示全部楼层 |阅读模式
gluUnProject
此函数的具体用途是将一个OpenGL视区内的二维点转换为与其对应的场景中的三维坐标。

这个函数在glu.h中的原型定义如下:

int APIENTRY gluUnProject (
    GLdouble       winx,
    GLdouble       winy,
    GLdouble       winz,
    const GLdouble modelMatrix[16],
    const GLdouble projMatrix[16],
    const GLint    viewport[4],
    GLdouble       *objx,
    GLdouble       *objy,
    GLdouble       *objz);

其中前三个值表示窗口坐标,中间三个分别为模型视图矩阵(Model/View Matrix),投影矩阵(Projection Matrix)和视区(ViewPort),最后三个为输出的世界坐标值。

现在我想通过这个函数用于物体随鼠标移动 代码如下:
gluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height),1.0f, 100.0f);


glLoadIdentity();                                                                                        // 重设矩阵
        glPushMatrix();       

        GLdouble    modelview[16];
        GLdouble    projection[16];
        GLint       viewport[4];
        RECT window;                                                                                                // 用来存窗口位置
        GetClientRect (g_window->hWnd,&window);                                                // 取窗口位置


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


        gluUnProject( (GLdouble) mouse_x, (GLdouble)window.bottom-mouse_y, -0.06,
                modelview, projection, viewport,
                &move_x, &move_y, &world_z);

        glTranslated(move_x,move_y,-6.0f);                       
        Object(0.14,0.04,0);        //nehe例子 传入参数画图象
       
        glPopMatrix();                                                                               

问题是关于Z轴的问题   
GLdouble       winz,  
深度值winZ的范围为0.0~1.0,近截面处为0.0,远截面处为1.0,其他介于0.0和1.0之间。

我认为在 gluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height),1.0f, 100.0f);
这句后 我的Z轴变换应该是 1.0-100.f 对应的winz应该是除以100 也就是我在 -6.0上画图象,应该用 -0.06传入
可是结果图象只在一个很小的区域内活动,我是哪里理解错了吗?
[em4]

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2007-2-9 00:37:00 | 显示全部楼层

Re: 关于 gluUnProject 的问题

winZ一般是用深度缓存中(winX,winY)对应的值,直接指定不太合适吧?
用glReadPixels可以读出,如:
glReadPixels( winX,winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readpixels.html

4

主题

28

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2007-2-10 14:15:00 | 显示全部楼层

Re: 关于 gluUnProject 的问题

对屏幕坐标向3d坐标转换,我也不知道,很想了解,顶

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-3-15 21:07:00 | 显示全部楼层

Re:关于 gluUnProject 的问题

给你一段代码 是我从网上找到的 我也在用 还是蛮不错的 自己理解一下
void GetOGLPos(int x, int y, double * posX, double * posY, double * posZ)
{
        GLint viewport[4];
        GLdouble projection[16];
        GLfloat winX, winY, winZ;

        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);
}

0

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2008-7-14 15:31:00 | 显示全部楼层

Re:关于 gluUnProject 的问题

相见恨晚

13

主题

49

帖子

55

积分

注册会员

Rank: 2

积分
55
QQ
发表于 2009-5-3 23:18:00 | 显示全部楼层

Re: 关于 gluUnProject 的问题

相奸恨晚

8

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
发表于 2009-5-16 14:46:00 | 显示全部楼层

Re:关于 gluUnProject 的问题

[em16]
视锥远平面是否在 <=1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 09:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表