#include<gl/glut.h>
#include<gl/GL.h>
#include<gl/GLU.h>
#include<math.h>
#include<iostream>
#define R 100
#define r 50
#define PI 3.1415926
], b1[], a2[], b2[];
;
;
void Calculate() {
    ;
    ; i < ; i++) {
        a1[i] = R*cos(angle*PI / );
        b1[i] = R*sin(angle*PI / );
        a2[i] = r*cos(PI /  + angle*PI / );
        b2[i] = r*sin(PI /  + angle*PI / );
        angle += ;
    }
}
void Init() {
    Calculate();
}
double target = 0.00;
double theta = 0.00;
bool right = true;
bool left = true;
bool top = true;
bool bottom = true;
;
;
bool scflg1 =true;
bool scflg2 = true;

void draw() {

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    /*glMatrixMode设置当前矩阵模式:
    GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
    GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
    GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
    与glLoadIdentity()一同使用*/
    glClearColor(, , , );
    gluOrtho2D(-, , -, );//左右下上
    //glPushMatrix();
    /*
     glTranslatef(0.0f,-20.0f,-40.0f)表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40
     glScaled(10.0f,10.0f,10.0f)表示将当前图形沿x,y,z轴分别放大为原来的10倍
    glRotatef(-80.0f,10.0f,1.0f,0.0f)表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度。
    */
    //glPopMatrix();

    //glPushMatrix();
     && right&&target<Height-) {//平移到最右边
        target += ;
    }
     && left&&Height>-Height+) {//到最右边返回到最左边
        right = false;
        target -= ;

    }
    else {
        right = true;
    }
    glTranslatef(target, target, );//沿着 X, Y 和 Z 轴移动。
    /*注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动
    而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量*/
    glRotated(theta, , , );//围绕z轴进行旋转
    theta += 2.5;
    if(sc>1.4)
    {
    sc=0.5;//进行模型缩放
    }else{
        sc += 0.001;}
    glScalef(sc, sc, );//模型缩放函数
    glBegin(GL_LINE_LOOP);
    ;i < ;i++) {
        glVertex2d(a1[i], b1[i]);
        glVertex2d(a2[i], b2[i]);
    }
    glEnd();
    //glPopMatrix();
    //glFlush();
    //glutSwapBuffers();

    //glLoadIdentity();
    glColor3d(, , );
    glFlush();//用于强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区[2]  中等待其他的OpenGL命令。
    glutSwapBuffers();//调换前后缓存
}

void DisPlay()
{   glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);//白色背景
    draw();
}

void main()
{
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(, );
    glutCreateWindow("第四次作业");

    Init();
    glutDisplayFunc(DisPlay);//glutDisplayFunc函数用于注册一个绘图函数, 这样操作系统在必要时刻就会对窗体进行重新绘制操作
    glutIdleFunc(DisPlay);//glutIdleFunc设置全局的回调函数,当没有窗口事件到达时,GLUT程序功能可以执行后台处理任务或连续动画
    glutMainLoop();//glutMainLoop进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环。
    system("pause");
}

OpenGL旋转平移 变换的更多相关文章

  1. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  2. OpenGL 的空间变换(上):矩阵在空间几何中的应用

    在使用 OpenGL 的应用程序中,当我们指定了模型的顶点后,顶点依次会变换到不同的 OpenGL 空间中,最后才会被显示到屏幕上.在变换的过程中,通过使用矩阵,我们更高效地来完成这些变换工作. 本篇 ...

  3. OpenGL 的空间变换(下):空间变换

    通过本文的上篇 OpenGL 的空间变换(上):矩阵在空间几何中的应用 ,我们了解到矩阵的基础概念.并且掌握了矩阵在空间几何中的应用.接下来,我们将结合矩阵来了解 OpenGL 的空间变换. 在使用 ...

  4. OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果

    OpenGL ES平移矩阵和旋转矩阵的左乘与右乘 在OpenGL .OpenGL ES中矩阵起着举足轻重的作用,而矩阵之间的左乘与右乘在效果上是不同的. 一.先平移后旋转 场景效果:人绕树旋转. 原理 ...

  5. opengl中场景变换|2D与3D互转换(转)

    opengl中场景变换|2D与3D互转换 我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1.从不同的位置去观察它.(视图变换) 2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我 ...

  6. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  7. WPF动态加载3D 放大-旋转-平移

    原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DW ...

  8. d3.js封装文本实现自动换行和旋转平移等功能

    我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...

  9. ARFoundation - 实现物体旋转, 平移,缩放

    ARFoundation - 实现物体旋转, 平移,缩放 本文目的是为了确定在移动端怎样通过单指滑动实现物体的旋转,双指实现平移和缩放. 前提知识: ARFoundation - touch poin ...

随机推荐

  1. 在Win7下用XManager远程控制ubuntu

    在Win7下用XManager远程控制ubuntu   远程主机通过xdmcp协议连接到ubuntu的图形终端,以图形终端方式登录. 远程主机是win7.ubuntu装在VMware虚拟机上,ubun ...

  2. 【模拟】Codeforces 699A Launch of Collider

    题目链接: http://codeforces.com/problemset/problem/699/A 题目大意: 给N个点,向左或向右运动,速度均为1,问最早什么时候有两个点相撞.无解输出-1 题 ...

  3. hdoj3351-stack

    Problem Description I'm out of stories. For years I've been writing stories, some rather silly, just ...

  4. @synthesize和@dynamic分别有什么作用?

    @property有两个对应的词,一个是 @synthesize,一个是 @dynamic.如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _ ...

  5. 工程建立多个source folder

    在工程中,想在建立多个source filder,总是报错,报错信息是 Cannot nest 'GzEdu/src/c' inside 'GzEdu/src'. To enable the nest ...

  6. ios 打电话结束返回到应用中

    在我们做打电话这个功能时,我们常常是调用这个方法: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel ...

  7. Swift开发之 使用系统的TabbarController

    使用系统的tabbar解决图片的问题. 用sb使用系统的tabbar,弄好后发现图片始终是蓝色的,并非原来的图片,后经上网查资料,问问同事,有了以下的这些代码,做个标记. AppDelegate中 f ...

  8. UML中的图

    用例图.类图.包图.顺序图.协作图.状态图.活动图.构件图.部署图等 1.用例图 显示多个外部参与者以及他们与系统提供的用例之间的连接.用例是系统中的一个可以描述参与者与系统之间交互作用功能单元.用例 ...

  9. okhttp 常用使用方式 封装 演示

    工具介绍 使用: AndroidStudio:[compile 'com.squareup.okhttp3:okhttp:3.4.2']和[compile 'com.zhy:okhttputils:2 ...

  10. .net框架介绍

    .net 一般指 .net Framework框架,是一种平台,一种技术 C# 是一种编程语言,可以开发基于.net平台的应用 Java 既是一种技术,也是一种语言 .net可以开发桌面应用程序    ...