OpenGL 基础图形绘制与投影变换
本文参考《Computer Graphics Using OpenGL》,第一个例子绘制了
1. 参数定义的House
2. a flurry of filled rectangles
3. Sierpinski曲线
含有鼠标和键盘响应函数onmouse和onkeyboard。
第二个例子绘制了这样一系列图形:
在其中有空间投影变换,主要应用了三个函数:
投影变换函数glViewport(), 矩阵平移函数glTranslated() 和正射投影函数 glOrtho()
上图实现代码参考《计算机图形学-用OpenGL实现第2版》:
#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); glutWireCone(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 screenglColor3d(0,0,0); // draw black linesaxis(0.5); // 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)glutWireCube(1.0);glPopMatrix();//Draw SphereglPushMatrix();glTranslated(1.0,1.0,0);// sphere at (1,1,0)glutWireSphere(0.25, 10, 8);glPopMatrix();//Draw ConeglPushMatrix();glTranslated(1.0,0,1.0);// cone at (1,0,1)glutWireCone(0.2, 0.5, 10, 8);glPopMatrix();//Draw TeapotglPushMatrix();glTranslated(1,1,1);glutWireTeapot(0.2); // teapot at (1,1,1)glPopMatrix();//Draw TorusglPushMatrix();glTranslated(0, 1.0 ,0); // torus at (0,1,0)glRotated(90.0, 1,0,0);glutWireTorus(0.1, 0.3, 10,10);glPopMatrix();//十二面体glPushMatrix();glTranslated(1.0, 0 ,0); // dodecahedron at (1,0,0)glScaled(0.15, 0.15, 0.15);glutWireDodecahedron();glPopMatrix();glPushMatrix();glTranslated(0, 1.0 ,1.0); // small cube at (0,1,1)glutWireCube(0.25);glPopMatrix();glPushMatrix();glTranslated(0, 0 ,1.0); // cylinder at (0,0,1)GLUquadricObj * qobj;qobj = gluNewQuadric();gluQuadricDrawStyle(qobj,GLU_LINE);gluCylinder(qobj, 0.2, 0.2, 0.4, 8,8);glPopMatrix();glFlush();}//<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>void main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );glutInitWindowSize(640,480);glutInitWindowPosition(100, 100);glutCreateWindow("Transformation testbed - wireframes");glutDisplayFunc(displayWire);glClearColor(1.0f, 1.0f, 1.0f,0.0f); // background is whiteglViewport(0, 0, 640, 480);//投影变换函数glutMainLoop();}
Reference:
http://www.oocities.org/uniq_friq/c_files/openGL/1lab/dots.htm