在理解的基础上,编写一个基于OpenGL的程序,绘制一个三角形,并分别绘制这个三角形经旋转、平移、缩放后的结果,如图1所示。
#include<GL/glut.h>
void Initial();
void ChangeSize(int w, int h);
void Display();
void DrawTriangle();
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("变换");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return 0;
}
void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void DrawTriangle(void)
{
glBegin(GL_TRIANGLES);
glVertex2f(0.0f, 0.0f);
glVertex2f(40.0f, 0.0f);
glVertex2f(20.0f, 40.0f);
glEnd();
}
void ChangeSize(int w, int h)
{
if (h == 0) h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-120.0f, 120.0f, -120.0f * h / w, 120.0f * h / w, -120.0f, 120.0f);
else
glOrtho(-120.0f * w / h, 120.0f * w / h, -120.0f, 120.0f, -120.0f, 120.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2f(-120.0f, 0.0f);
glVertex2f(120.0f, 0.0f);
glVertex2f(0.0f, -120.0f);
glVertex2f(0.0f, 120.0f);
glEnd();
glColor3f(1.0f, 0.0, 0.0f);
DrawTriangle();
glRotatef(200.0f, 0.0f, 0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
DrawTriangle();
glLoadIdentity();
glTranslatef(-80.0f, 0.0f, 0.0f);
glColor3f(1.0, 1.0f, 0.0f);
DrawTriangle();
glLoadIdentity();
glTranslatef(10.0f, -10.0f, 0.0f);
glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
glScalef(1.5f, 2.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
DrawTriangle();
glFlush();
}