之前使用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. 在npm上发布一个自己的包

    1.首先你要在npm上创建一个账号,这里需要输入邮箱的,注意激活邮箱否则无法publish自己的包 2.在本地创建一个文件夹,输入npm init初始化项目,这里是我使用npm init创建的pack ...

  2. MDK错误 Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o). 解决方法

    此错误产生的位置在STM32工程所包含的汇编启动代码文件,如下图 熟悉ARM汇编的朋友一定可以看出,这是一个子程序调用语句,而调用的子程序正是SystemInit.出现错误的原因就是汇编器没有在代码之 ...

  3. Python下载及Python最强大IDEPyCharm下载链接

    Python下载: https://www.python.org/downloads/ PyCharm下载: https://www.jetbrains.com/pycharm/download/#s ...

  4. 学习Selenium的历程

    Selenium资源包下载 我这段时间在学习Web自动化测试方面的知识,在搭建相应的环境上出现了问题.去Selenium官网下载相对应得包,老是下载不了.而如果直接到CSDN等上下载,需要积分,或者下 ...

  5. Vue(十四)过渡(动画)

    过渡(动画) 1. 简介 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果 本质上还是使用CSS3动画:transition.animation 2. 基本用法 使用trans ...

  6. 几个例子弄懂JS 的setTimeout的运行方式

                        function test() {   var a = 1;   setTimeout(function() {     alert(a);     a = 5 ...

  7. 【map离散&容斥】Ghosts @Codeforces Round #478 (Div. 2) D

    传送门 题意:给你一条直线的斜率a和截距b,和某一时刻n个在直线上的点的横坐标,以及沿坐标轴方向的速度.问你这些点在(-∞,+∞)的时间内的碰撞次数. solution 设两个点在t时刻相碰,有: x ...

  8. 做了一个动态代理IP池项目,邀请大家免费测试~

    现在出来创业了,目前公司在深圳. 做了啥呢, 做了一个动态代理 IP 池项目 现在邀请大家免费测试体验! 免费激活码:关注微信公众号:2808proxy (每人每天限领一次噢~) 网站:https:/ ...

  9. ionic ion-tab图标修改, 自定义tab图标

    遇到需要自定义tab图标很简单, 只需要自定义相应的css就可以了, 这里要注意的是如何调整背景图片的大小. <ion-view hide-back-button="false&quo ...

  10. 一步步教你轻松学KNN模型算法

    一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...