本例子参考于网络,并进行了一些修改,使用glut+vs2008来实现。

在鼠标点击处重新画一个旋转的红色立方体!

参考代码如下:

 C++ Code 
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
 
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <vector>

using namespace std;

typedef struct Point3D
{
    double objx;
    double objy;
    double objz;
}POINT_3D, *PPOINT_3D;

;
;
;
;
vector<POINT_3D> vec3dPoint;
vector<POINT_3D>::iterator it;

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

/*THE FUNCTION TO DRAW THE STUFF ON THE SCREEN*/
void display( )
{
    glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
    
    //The big green floor like polygon
    glBegin( GL_POLYGON );
    glColor3f(  );
    glVertex3f( -  );
    glVertex3f( -  );
    glVertex3f(  );
    glVertex3f(  );
    glEnd( );

for (it = vec3dPoint.begin(); it != vec3dPoint.end(); it++)
    {
        //The red cube to be drawn at clicked position
        glPushMatrix( );
        glColor3f(  );
        glTranslatef( it->objx,it->objy,it->objz );
        glRotatef(angle, );
        angle++;
        )
        {
            angle = ;
        }
        glutSolidCube(  );
        glPopMatrix( );
    }

glFlush( );
    glutSwapBuffers( );
}

void mouse( int button, int state, int x, int y)
{
    ];
    ];
    ;
    
    /*Read the projection, modelview and viewport matrices
    using the glGet functions.*/
    glGetDoublev( GL_PROJECTION_MATRIX, projection );
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glGetIntegerv( GL_VIEWPORT, viewport );

//Read the window z value from the z-buffer 
, 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.
]-y, 0.0, modelview, projection, viewport, &objnx, &objny, &objnz );
    gluUnProject( x, viewport[]-y, z, modelview, projection, viewport, &objx, &objy, &objz );
    gluUnProject( x, viewport[, modelview, projection, viewport, &objfx, &objfy, &objfz );
    POINT_3D objxyz;
    objxyz.objx = objx;
    objxyz.objy = objy;
    objxyz.objz = objz;
    vec3dPoint.push_back(objxyz);
}

void initVector()
{
    vec3dPoint.clear();
    POINT_3D objxyz;
    objxyz.objx = objx;
    objxyz.objy = objy;
    objxyz.objz = objz;
    vec3dPoint.push_back(objxyz);
}

void init( int width, int height )
{
    glViewport( , width, height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity( );
    gluPerspective(  );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );
    gluLookAt(  );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    //The most important part specify the things your
    //glut window should provide
    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize(  );
    glutCreateWindow("gluUnProject Demo");
    
    glClearColor(  );
    //enable z buffer
    glEnable( GL_DEPTH_TEST );
    //set the value in z-buffer as 1.0
 );
    initVector();
    init(  );
    glutDisplayFunc( display );
    glutReshapeFunc( init );
    glutIdleFunc( display );
    glutMouseFunc( mouse );
    glutMainLoop( );
}

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

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

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

  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. bzoj 4128 矩阵求逆

    /************************************************************** Problem: 4128 User: idy002 Language: ...

  2. SQL数据库连接到服务器出错——无法连接到XXX

    问题:Windows或者SQL Server身份验证下,出现连接到服务器出错 解决方式: 1.检查实例名称是否正确,如下 根据自己电脑的实际名称修改修改如下: 1)Microsoft SQL Serv ...

  3. oracle级联删除

    oracle级联删除可以使用触发器来实现,但是比较麻烦,最简单的就是直接建立表的主外键关系,给列设置级联删除. ------创建了CLASS表,并设置ID字段为主键. -- Create table ...

  4. TCP/IP协议随笔

    今天翻博客的时候看到了TCP/IP协议相关的几篇文章,写的非常好,LZ打算把其中的重点整理一下,虽然都是一些概念性的东西,平时编码的时候可能用不到,但是起码我们应该知道自己是在哪一层编码,又有哪些协议 ...

  5. (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫

    下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...

  6. Caffe使用step by step:caffe框架下的基本操作和分析

    caffe虽然已经安装了快一个月了,但是caffe使用进展比较缓慢,果然如刘老师说的那样,搭建起来caffe框架环境比较简单,但是完整的从数据准备->模型训练->调参数->合理结果需 ...

  7. Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法

    在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...

  8. Spark2.2(三十八):Spark Structured Streaming2.4之前版本使用agg和dropduplication消耗内存比较多的问题(Memory issue with spark structured streaming)调研

    在spark中<Memory usage of state in Spark Structured Streaming>讲解Spark内存分配情况,以及提到了HDFSBackedState ...

  9. HDu 2544 最短路【dijkstra &amp; floyed &amp; SPFA 】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. javascript删除数组,索引出现问题解决办法。

    var data = [ { isRemove: 0, name: "项目1" }, { isRemove: 1, name: "项目2" }, { isRem ...