OpenGL 基础图形绘制与投影变换(2)

// Initialization
void Init(void)   
{
 glClearColor(1.0,1.0,1.0,0.0); // Set white background color
 glColor3f(0.0f,0.0f,0.0f);    // Set the drawing color
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(0.0,640.0,0.0,480.0);
}

void myDisplay()
{
 glClear(GL_COLOR_BUFFER_BIT);      //clear the screen
 GLintPoint Mypoint = {200,100};
 parameterizedHouse(Mypoint,100,100);
 drawFlurry(4,100,100);
 glFlush();
}

void main(int argc,char *argv[])
{
 glutInit(&argc, argv);  // Initialize the toolkit
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  // Set display mode
 glutInitWindowPosition(100, 150);  // Set window pozition on screen
 glutInitWindowSize(640, 480);      // Set window size
 glutCreateWindow("parameterizedHouse, Flurry and drawSierpinski"); // Open the screen window
 glutDisplayFunc(myDisplay); // Register redraw function
 glutMouseFunc(myMouse);
 glutKeyboardFunc(onKeyBoard);
 Init();
 glutMainLoop();  // Go into a perpetual loop
}

效果图:

OpenGL 基础图形绘制与投影变换

第二个例子绘制了这样一系列图形:

OpenGL 基础图形绘制与投影变换

在其中有空间投影变换,主要应用了三个函数:

投影变换函数glViewport(), 矩阵平移函数glTranslated() 和正射投影函数 glOrtho()

上图实现代码参考《计算机图形学-用OpenGL实现第2版》:

计算机图形学(第三版)高清中文版 PDF 下载 见 

#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 end
 glPushMatrix();
 glBegin(GL_LINES);
 glVertex3d(0, 0, 0); glVertex3d(0,0,length); // along the z-axis
 glEnd();
 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 shape
 glLoadIdentity();
 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 camera
 glLoadIdentity();
 gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//define viewpoint transformation

//Draw axis
 glClear(GL_COLOR_BUFFER_BIT); // clear the screen
 glColor3d(0,0,0); // draw black lines
 axis(0.5);      // z-axis
 glPushMatrix();
 glRotated(90, 0,1.0, 0);
 axis(0.5);     // y-axis
 glRotated(-90.0, 1, 0, 0);
 axis(0.5);     // z-axis
 glPopMatrix(); 

//Draw Cube
 glPushMatrix();
 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 Sphere
 glPushMatrix(); 
 glTranslated(1.0,1.0,0); // sphere at (1,1,0)
 glutWireSphere(0.25, 10, 8);
 glPopMatrix(); 

//Draw Cone
 glPushMatrix(); 
 glTranslated(1.0,0,1.0); // cone at (1,0,1)
 glutWireCone(0.2, 0.5, 10, 8);
 glPopMatrix();

//Draw Teapot
 glPushMatrix();
 glTranslated(1,1,1);
 glutWireTeapot(0.2); // teapot at (1,1,1)
 glPopMatrix();

//Draw Torus
 glPushMatrix();
 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();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2a86919cb766d096b2be1a22d2f3294d.html