OpenGL basic graphics rendering and Projection Transformation

Source: Internet
Author: User

This article draws the first example by referring to computer graphics using OpenGL.

1. House defined by the Parameter

2. a flurry of filled rectangles

3. Sierpinski Curve

Contains the mouse and keyboard response functions onmouse and onkeyboard.


/************************************************************************//* CreateTime:2013-2-18**Author:@Rachel Zhang**Discription: Draw Parameter House, Flurry and Sierpinski**3rd-party:OpenGL*//************************************************************************/#include "GL/glut.h"#include "stdlib.h"#include <iostream>using namespace std;#define screenHeight 480class GLintPoint{public: GLint x, y;};// Create a number between 0 and m(a number which will be given)// the input m must be less than 32767 according to P49 in <Computer Graphics Using OpenGL>int random(int m){return rand()%m;}void drawDot (GLint x, GLint y){glPointSize(3);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}typedef struct{GLfloat r, g, b;} GLfloatRGBColour;GLfloatRGBColour colour[8] = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f},{0.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f},{0.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 1.0f},{1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}};void setPenColour(GLfloatRGBColour newColour){glColor3f(newColour.r, newColour.g, newColour.b);}/************************************************************************//*                                Draw Functions                                      *//************************************************************************/void parameterizedHouse(GLintPoint peak, GLint width, GLint height)// the top of house is at the peak; the size of house is given//  by height and width{glBegin(GL_LINE_LOOP);glVertex2i(peak.x,             peak.y);  // draw shell of house glVertex2i(peak.x + width / 2, peak.y - 3 * height /8);glVertex2i(peak.x + width / 2,  peak.y -     height);glVertex2i(peak.x - width / 2, peak.y -     height);glVertex2i(peak.x - width / 2, peak.y - 3 * height /8);glEnd();}void drawFlurry(int num, int Width, int Height)// draw num random rectangles in a Width by Height rectangle {for (int i = 0; i < num; i++) {GLint x1 = random(Width);// place corner randomly GLint y1 = random(Height);GLint x2 = random(Width); // pick the size so it fits GLint y2 = random(Height);GLfloat lev = random(10)/10.0;// random value, in range 0 to 1 glColor3f(lev,lev,lev);// set the gray level glRecti(x1, y1, x2, y2);// draw the rectangle}glFlush();}  void drawSierpinski(GLintPoint corner[3]){ int i, index, tcolour=0;GLintPoint point;point = corner[random(3)];drawDot(point.x, point.y);for (i = 0; i < 1000; i++){index = random(3);point.x = (point.x + corner[index].x)/2;point.y = (point.y + corner[index].y)/2;  tcolour = (++tcolour)%7;       // col = (col + 1) mod 7;setPenColour(colour[tcolour]);drawDot(point.x, point.y);}}/************************************************************************//*                         Mouse Listener and keyboard Listener                    *//************************************************************************/void myMouse(int button, int state, int x, int y){static GLintPoint corners[3];static int numCorners;if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){corners[numCorners].x = x;corners[numCorners].y = screenHeight - y - 1;if (++numCorners == 3){drawSierpinski(corners);numCorners = 0;}}else if (button==GLUT_RIGHT_BUTTON)glClear(GL_COLOR_BUFFER_BIT);glFlush();}void onKeyBoard(unsigned char key,int mousex, int mousey){switch (key){case 'q':exit(0);case 'r':static GLintPoint corners[3];for (int i=0;i<3;i++){corners[i].x = random(640);corners[i].y = random(screenHeight);}drawSierpinski(corners);default:break;}}// Initialization void Init(void)     {glClearColor(1.0,1.0,1.0,0.0); // Set white background colorglColor3f(0.0f,0.0f,0.0f);    // Set the drawing colorglMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,640.0,0.0,480.0);}void myDisplay(){glClear(GL_COLOR_BUFFER_BIT);       //clear the screenGLintPoint Mypoint = {200,100};parameterizedHouse(Mypoint,100,100);drawFlurry(4,100,100);glFlush();}void main(int argc,char *argv[]){glutInit(&argc, argv);  // Initialize the toolkitglutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  // Set display modeglutInitWindowPosition(100, 150);  // Set window pozition on screenglutInitWindowSize(640, 480);      // Set window sizeglutCreateWindow("parameterizedHouse, Flurry and drawSierpinski"); // Open the screen windowglutDisplayFunc(myDisplay); // Register redraw function glutMouseFunc(myMouse);glutKeyboardFunc(onKeyBoard);Init();glutMainLoop();  // Go into a perpetual loop}

:


The second example draws a series of images:


The spatial projection transformation mainly applies three functions:

Projection transform function glviewport (), matrix translation function gltranslated (), and normal Projection Function glortho ()

For implementation code, refer to "Computer Graphics-use OpenGL to implement version 2nd":

# Include <windows. h> // suitable when using Windows 95/98/NT # include <Gl/GL. h> # include <Gl/Glu. h> # include <Gl/glut. h> // <axis >>>>>>>>>>> void axis (double length) {// draw a z-axis, with cone at endglpushmatrix (); glbegin (gl_lines); glvertex3d (0, 0, 0); glvertex3d (0, 0, length ); // along the Z-axisglend (); gltranslated (0, 0, length-0.2); glwirecone (0.04, 0.2, 12, 9); glpopmatrix ();} // <displaywire> >>>>>>>>>>>>>> void displaywire (void) {glmatrixmode (gl_projection); // set the view volume shapeglloadidentity (); glortho (-2.0*64/48 .0, 2.0*64/48 .0,-2.0, 2.0, 0.1, 100 ); // glmatrixmode (gl_modelview); // position and aim the cameraglloadidentity (); glulookat (2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // define viewpoint transformation // draw axisglclear (gl_color_buffer_bit); // clear the screengcolor3d (0.5, 0); // draw black linesaxis ); // Z-axisglpushmatrix (); glrotated (90, 0, 1.0, 0); axis (0.5); // y-axisglrotated (-90.0, 1, 0, 0 ); axis (0.5); // Z-axisglpopmatrix (); // draw cubeglpushmatrix (); gltranslated (0.5, 0.5, 0.5); // multiply by a translation matrix, define Center (0.5, 0.5, 0.5) gluwirecube (1.0); glpopmatrix (); // draw sphereglpushmatrix (); gltranslated (1.0, 1.0, 0 ); // sphere at (0.25, 0) gluwiresphere (1.0, 10, 8); glpopmatrix (); // draw coneglpushmatrix (); gltranslated (1.0, 0 ); // cone at (0.2, 1) maid (0.5, 10, 8); glpopmatrix (); // draw teapotglpushmatrix (); gltranslated (, 1 ); gluwireteapot (0.2); // teapot at (1.0, 1) glpopmatrix (); // draw torusglpushmatrix (); gltranslated (0, 0 ); // torus at (90.0, 0) glrotated (0.1, 0.3, 0); fig (,); glpopmatrix (); // 12- glpushmatrix (); gltranslated (1.0, 0, 0); // dodecahedron at (0.15, 0) glscaled (0.15, 0.15,); fig (); glpopmatrix (); glpushmatrix (); gltranslated (0, 1.0, 1.0); // small cube at (0.25, 1) glwirecube (); glpopmatrix (); glpushmatrix (); gltranslated (0, 0, 1.0); // cylinder at (0.2, 1) gluquadricobj * qobj; qobj = glunewquadric (); gluquadricdrawstyle (qobj, glu_line); glucylinder (qobj, 0.2, 0.4, 8, 8); glpopmatrix (); glflush ();} // <main >>>>>>>>>>>> >>>>>>>>>>>>>>>> void main (INT argc, char ** argv) {gluinit (& argc, argv); gluinitdisplaymode (glu_single | glu_rgb); gluinitwindowsize (640,480); gluinitwindowposition (100,100 ); valley createwindow ("transformation Testbed-wireframes"); maid (displaywire); glclearcolor (1.0f, 1.0f, 1.0f, 0.0f); // background is whiteglviewport (0, 0,640,480 ); // projection transform function: FIG ();}



Reference:

Http://www.oocities.org/uniq_friq/c_files/openGL/1lab/dots.htm


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.