参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。
如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT修改为GL_SMOOTH就可以表现出如下的第一幅图的混合色效果。第二幅图中表现得是经过几种分开的变换的效果,分别为平移、旋转、缩放和原图,其中也是使用了混合颜色的方式进行填充的。为了使几个转换之间相互不影响,应注意每一个变换之前要加上这样的一行代码函数:glLoadIdentity();实现的核心代码在第二幅图下面附上。第三幅图中即为要求的完成几种变换的复合变换,这里要注意的为要函数调用采用的为列向量的方式,所以在变换时要注意变换的实际顺序与代码的书写顺序为相反的,所以这里如果不能正确的调用函数,就会出现问题。当然要求尽量调整裁剪窗口使其图形尽量显示在视口的中心,所以这里要调整gluOrtho2D(-200.0,250.0,-100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);这样基本上就显示在中间位置了,也就是第三幅图中的效果。详细代码和效果附下:
第一幅图
第二幅图
【注】核心代码,其他不同代码如下面附代码的有色部分:
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
glColor3f(1.0,1.0,1.0);
glTranslatef(-100.0,-50.0,1.0);
draw_triangle();
glLoadIdentity();
glTranslatef(0.0,100.0,1.0);
draw_triangle();
glLoadIdentity();
glRotatef(90.0,0.0,0.0,1.0);
draw_triangle();
glLoadIdentity();
glScalef(0.5,0.5,1.0);
draw_triangle();
glFlush();
}
第三幅图
【注】第三幅图效果的实现代码:
#include
#include
#include
voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
}
voiddraw_triangle(void)
{
glShadeModel(GL_SMOOTH);
glColor3f(0.2,0.7,0.30);
glBegin(GL_TRIANGLES);//画出三角形,为混合色填充方式
glVertex2f(50.0,25.0);
glColor3f(0.4,0.5,0.60);
glVertex2f(150.0,25.0);
glColor3f(0.9,0.7,0.8);
glVertex2f(100.0,100.0);
glEnd();
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
glColor3f(1.0,1.0,1.0);
glTranslatef(-100.0,-50.0,1.0);
draw_triangle();
glLoadIdentity();
glTranslatef(0.0,100.0,1.0);
glRotatef(90.0,0.0,0.0,1.0);
glScalef(0.5,0.5,1.0);
draw_triangle();//经过三种变换后画出图形
glFlush();
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
gluOrtho2D(-200.0,250.0,-100.0*(GLfloat)h/(GLfloat)w,
200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口
else
gluOrtho2D(-200.0*(GLfloat)w/(GLfloat)h,
250.0*(GLfloat)w/(GLfloat)h,-50.0,200.0);
glMatrixMode(GL_MODELVIEW);
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return0;
}
二维图形平移变换c语言程序 [转载]计算机图形学Opengl实现二维图形的平移 旋转 缩放复合变换...