计算机图形学Opengl实现二维图形的…

来源:互联网 发布:ubuntu crontab 日志 编辑:程序博客网 时间:2024/05/18 03:38

参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。

如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT修改为GL_SMOOTH就可以表现出如下的第一幅图的混合色效果。第二幅图中表现得是经过几种分开的变换的效果,分别为平移、旋转、缩放和原图,其中也是使用了混合颜色的方式进行填充的。为了使几个转换之间相互不影响,应注意每一个变换之前要加上这样的一行代码函数:glLoadIdentity ();实现的核心代码在第二幅图下面附上。第三幅图中即为要求的完成几种变换的复合变换,这里要注意的为要函数调用采用的为列向量的方式,所以在变换时要注意变换的实际顺序与代码的书写顺序为相反的,所以这里如果不能正确的调用函数,就会出现问题。当然要求尽量调整裁剪窗口使其图形尽量显示在视口的中心,所以这里要调整gluOrtho2D(-200.0,250.0,-100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);这样基本上就显示在中间位置了,也就是第三幅图中的效果。详细代码和效果附下:



计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换

第一幅图

计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换

第二幅图

【注】核心代码,其他不同代码如下面附代码的有色部分:

void display(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 ();

}

计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换

第三幅图

【注】第三幅图效果的实现代码:

#include<windows.h>

#include <GL/glut.h>

#include <stdlib.h>

 

void init(void)

{

    glClearColor (0.0, 0.0, 0.0, 0.0);

    glShadeModel (GL_SMOOTH);

}

 

void draw_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();

}

 

void display(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 ();

}

 

void reshape (int w, int h)

{

    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);

}

int main(int argc, 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();

    return 0;

}

原创粉丝点击