之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现。

代码如下:

 main.cpp 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#include "GLWidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

GLWidget glw;
    glw.resize();
    glw.setWindowTitle("gluUnProject Demo");
    glw.show();

return a.exec();
}

GLWidget.h 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>

class GLWidget : public QGLWidget
{
    Q_OBJECT

public:
    GLWidget(QWidget *parent = );
    ~GLWidget();

protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();

virtual void mousePressEvent(QMouseEvent *event);

private:
    void draw();
    void DrawFloor();
    void DrawAxis();

GLdouble   objx;
    GLdouble   objy;
    GLdouble   objz;
};

#endif // GLWIDGET_H

GLWidget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
 
#include "GLWidget.h"
#include <QMouseEvent>
#include <GL/glu.h>
#include <QDebug>

;

GLWidget::GLWidget(QWidget *parent)
    : QGLWidget(parent)
{
    objx = ;
    objy = ;
    objz = ;
}

GLWidget::~GLWidget()
{

}

void GLWidget::initializeGL()
{
    glClearColor();

glClearDepth();
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
}

void GLWidget::resizeGL(int w, int h)
{
    ];
    glViewport( , w, h );
    glGetIntegerv( GL_VIEWPORT, viewport );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity( );
    gluPerspective(  );
    ];
    glGetDoublev( GL_PROJECTION_MATRIX, projection );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );
    gluLookAt(  );
}

void GLWidget::paintGL()
{

glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

//The big gray floor like polygon
    glBegin( GL_POLYGON );
    glColor3f(  );
    glVertex3f( -  );
    glVertex3f( -  );
    glVertex3f(  );
    glVertex3f(  );
    glEnd( );
    //DrawFloor();
    DrawAxis();

//The red cube to be drawn at clicked position
    glPushMatrix( );
    glTranslatef(objx, objy, objz );
    draw();
    ];
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glPopMatrix( );
}

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    updateGL();
    ];
    ];
    float x = event->pos().rx();
    float y = event->pos().ry();
    GLfloat  z = ;
    double winx, winy, winz;
    qDebug("Window coords are (%d, %d)\n", x, y);
    /*Read the projection, modelview and viewport matrices using the glGet functions.*/
    glGetIntegerv( GL_VIEWPORT, viewport );
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glGetDoublev( GL_PROJECTION_MATRIX, projection );

//Read the window z value from the z-buffer

glReadBuffer(GL_FRONT);
    glReadPixels( x, viewport[, GL_DEPTH_COMPONENT, GL_FLOAT, &z );

//Use the gluUnProject to get the world co-ordinates of
    //the point the user clicked and save in objx, objy, objz.
    gluUnProject( x, viewport[]-y, z, modelview, projection, viewport, &objx, &objy, &objz );
    qDebug("World coords at z=%.1f are (%.3f, %.3f, %.3f)\n", z, objx, objy, objz);

updateGL();
}

void GLWidget::draw()
{
    glPushMatrix();
    glBegin(GL_QUAD_STRIP);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glEnd();
    glBegin(GL_QUAD_STRIP);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glColor3f(.0f);
    glEnd();
    glPopMatrix();
}

/*---------------------------------------------------------------------------*/
void GLWidget::DrawFloor()
{
    glDepthMask(GL_FALSE);
    glColor4ub();
    glBegin(GL_LINES);

glNormal3d();
    )
    {
        glVertex3i(i, , -s_Scale);
        glVertex3i(i, , s_Scale);
        glVertex3i(-s_Scale, , i);
        glVertex3i(s_Scale, , i);
    }
    glEnd();
    glDepthMask(GL_TRUE);
}
/*---------------------------------------------------------------------------*/
void GLWidget::DrawAxis( void )
{
    // Local Space
;

glPushAttrib( GL_LINE_BIT );
    glLineWidth(.0f );
    glBegin( GL_LINES );

// X轴
 );
    glVertex3i(  );
    glVertex3i( s_Scale,  );

// Y轴
 );
    glVertex3i(  );
    glVertex3i(  );

// Z轴
 );
    glVertex3i(  );
    glVertex3i( , s_Scale );

glEnd( );
    glPopAttrib( );
}

代码仅供参考,最近一直在研究这个,用于实现场景中单个对象的拖拽,效果还欠佳,欢迎交流讨论。

OpenGL 获取当前屏幕坐标的三维坐标(gluUnProject使用例子 Qt)的更多相关文章

  1. OpenGL 获取当前屏幕坐标的三维坐标(gluUnProject使用例子 VS+glut)

    本例子参考于网络,并进行了一些修改,使用glut+vs2008来实现. 在鼠标点击处重新画一个旋转的红色立方体! 参考代码如下:  C++ Code  123456789101112131415161 ...

  2. OpenGL 获取当前屏幕坐标对应的三维坐标

    转自原文 OpenGL 获取当前屏幕坐标对应的三维坐标,使用很简单glu库中的一个函数 #include <GL/glut.h> #include <stdlib.h> #in ...

  3. Unity 坐标 转换 详解 World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

    在制作游戏中我们经常会遇到这样一个需求: 在人物模型的上面显示 名字.称号 一类的文字或者图片 如下图 人物模型属于是Camera1   UI Title信息属于NGUI Camera2 如下图 这时 ...

  4. OpenGL入门程序五:三维绘制

    1.现实世界观察一个物体的时候,可能涉及到的三维变化: 1>视图变化------从不同的角度观察. 2>模型变化------移动.旋转物体,计算机中当然还可以对物体进行缩放. 3>投 ...

  5. PIE SDK专题制图下屏幕坐标转地图坐标

    1.    功能简介 PIESDK提供了专题制图下鼠标屏幕坐标转地图坐标功能. 2. 功能实现说明 2.1屏幕坐标转地图坐标 此功能用到了IPageLayout.ToMapPoint()方法,它的主要 ...

  6. “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”

    0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...

  7. C# JackLib系列之如何获取地球上两经纬度坐标点间的距离

    获取地球上两经纬度坐标点间的距离,利用[大圆距离公式]   A diagram illustrating great-circle distance (drawn in red) between tw ...

  8. ACM1174_爆头解题思路_空间三维坐标求点到直线的距离

    /* 爆头 Description gameboy是一个CS高手,他最喜欢的就是扮演警察, 手持M4爆土匪的头.也许这里有人没玩过CS,有必 要介绍一下“爆头”这个术语:所谓爆头,就是子 弹直接命中对 ...

  9. MATLAB在三维坐标中显示图片 并 使得图片部分透明

    要画一个光路图,本来可以用proe,但是鼠标不好用,有些操作也忘了,用MATLAB画了个.下面是用到的图片. 但是三维坐标中显示彩色图片的目标没有搞定,做了个灰度图,然后用仿射程序将彩色图片贴到了二维 ...

随机推荐

  1. BZOJ3737 : [Pa2013]Euler

    首先枚举$n$的每个约数$d$,检查一下$d+1$是否是质数,这些数都有可能作为答案的质因子出现. 考虑爆搜,每次枚举下一个要在答案中出现的质因子$p$,将$n$除以$p-1$,再枚举$p$的指数,然 ...

  2. Java集合框架(比较啰嗦)

    阅读目录 概念与作用 集合框架的体系结构 Collection接口和List接口简介 Map和HashMap简介 集合工具类:Collections 小结 概念与作用 集合概念 现实生活中:很多事物凑 ...

  3. Jupyter Notebook 介绍 安装和使用技巧

    Jupyter Notebook介绍.安装及使用教程 原文链接:https://www.jianshu.com/p/91365f343585 目录一.什么是Jupyter Notebook? 1. 简 ...

  4. sqli-labs Less-11 and Less-12

    这关是post注入的世界,post注入就是表单中填好数据通常会被送到服务器,然后由服务器将其发送到它要去的地方(比如,送到一个服务器网关程序中,然后由这个程序对其进行处理). 不显示东西,那么加引号等 ...

  5. python测试开发django-51.Ajax发送post请求登录案例

    前言 我想实现一个登录功能:登录的接口是另外一个地方提供,页面上点登录按钮的时候,先访问登录接口,根据接口返回json信息判断是否登录成功,登录成功页面跳转,登录不成功,在登录首页显示失败原因 登录页 ...

  6. 如何确定Isilon cluster的网卡类型是40GbE的还是10GbE的

    可以使用isi upgrade cluster firmware devices命令. 从命令行输出可以看到,当前的cluster使用的是40G的前端网卡. 如果是10G网卡,输出结果应当是如下的样子 ...

  7. Execution failed for task ':compileDebugAidl'.

    昨天终于升级了下Ubuntu系统到16.04LTS,之前是12.04LTS(导致内网一些同事开发的网址无法打开,以及其他工具软件无法安装). 安装完android开发工具,运行之前的project,出 ...

  8. IDEA调试SpringMvc项目时,出错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener,解决办法

    具体报错信息如下图所示: 解决方法:File > Project Structure > Artifacts > 在右侧Output Layout右击项目名,选择Put into O ...

  9. Win10系统的DELL平板如何重装WIN10系统

    首先参考"Win10系统的SurfacePro4如何重装系统-1 SurfacePro专用的PE"这篇文章,做一个WIN10平板专用的PE 然后开机按F2可以进入BIOS设置,如果 ...

  10. 【PMP】关键路径法与关键链法

    通俗理解 关键路径法:把项目上的资源都事先全部分到每个活动上. 关键链法:每个活动不打富余,项目经理自己掌握资源,哪个成员执行过程中遇到困难,再给他单独分配资源. PMBOK定义 关键路径法:关键路径 ...