本例子参考于网络,并进行了一些修改,使用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; #define HEIGHT 480 #define WIDTH 640 typedef struct Point3D { double objx; double objy; double objz; }POINT_3D, *PPOINT_3D; double objx = 0, objy = 0, objz = 0; double objnx = 0, objny = 0, objnz = 0; double objfx = 0, objfy = 0, objfz = 0; double angle = 0.0; 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( 0, 1, 0 ); glVertex3f( -100, 0, 100 ); glVertex3f( -100, 0, -100 ); glVertex3f( 100, 0, -100 ); glVertex3f( 100, 0, 100 ); glEnd( ); for (it = vec3dPoint.begin(); it != vec3dPoint.end(); it++) { //The red cube to be drawn at clicked position glPushMatrix( ); glColor3f( 1, 0, 0 ); glTranslatef( it->objx,it->objy,it->objz ); glRotatef(angle, 1.0, 1.0, 1.0); angle++; if (angle > 360) { angle = 0.0; } glutSolidCube( 10 ); glPopMatrix( ); } glFlush( ); glutSwapBuffers( ); } void mouse( int button, int state, int x, int y) { double modelview[16], projection[16]; int viewport[4]; float z = 1; /*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 glReadPixels( x, viewport[3]-y, 1, 1, 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[3]-y, 0.0, modelview, projection, viewport, &objnx, &objny, &objnz ); gluUnProject( x, viewport[3]-y, z, modelview, projection, viewport, &objx, &objy, &objz ); gluUnProject( x, viewport[3]-y, 1.0, 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( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); gluPerspective( 45, 1.33, 0.1, 400 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); gluLookAt( 0, 100, 200, 0, 0, 0, 0, 1, 0 ); } 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( 640, 480 ); glutCreateWindow("gluUnProject Demo"); glClearColor( 0, 0, 0, 0 ); //enable z buffer glEnable( GL_DEPTH_TEST ); //set the value in z-buffer as 1.0 glClearDepth( 1.0 ); initVector(); init( 640, 480 ); glutDisplayFunc( display ); glutReshapeFunc( init ); glutIdleFunc( display ); glutMouseFunc( mouse ); glutMainLoop( ); } |