计算机图形学 实验二 OpenGL简单动画

 

#include "stdafx.h"


#include <GL/glut.h>

#include <math.h>

#define MAX_LOADSTRING 100

#define PI 3.14159

SYSTEMTIME timeNow;

float hh, mm, ss;

int n = 6, R = 10;

int k = 0;

// 此代码模块中包含的函数的前向声明:

float theta = 0.0;

float theta_line = 0.0;

void Keyboard(unsigned char key, int x, int y);

void Display(void);

void Reshape(int w, int h);

void mytime(int t);

void init();

int main()

{
    // TODO: 在此放置代码。

    char* argv[] = { "hello"," " };

    int argc = 2;

    glutInit(&argc, argv); //初始化GTD工座

    glutInitWindowSize(700, 700);//设置显示窗口大小

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置显示模式 (注意双缓存)

    glutCreateWindow("A Rotating Square"); // 创建显示窗口

    init();

    glutDisplayFunc(Display); // 注册显示回调函数

    glutReshapeFunc(Reshape); //注册窗口改变回调函数

    glutTimerFunc(1000, mytime, 10); //1000毫秒后调用时间函数mytime

    glutMainLoop(); //进入事件处理循环

    return 0;

}

void Display(void)

{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1, 1, 1);                             //设置黄色绘图颜色
    glBegin(GL_POLYGON);                                //开始绘制六边形 
    for (int i = 0; i < n; i++)
        glVertex2f(R * cos(theta + i * 2 * PI / n), R * sin(theta + i * 2 * PI / n));  //顶点坐标 
    glEnd();
    
    float xs, ys, xm, ym, xh, yh;
    float xc = 0, yc = 0;
    //xc, yc为时针中心点坐标
    //xs, ys为秒针终止点坐标
    //xm, ym为分针终止点坐标
    xs = xc + R * cos(PI / 2.0 - ss / 60 * 2 * PI);
    ys = yc + R * sin(PI / 2.0 - ss / 60 * 2 * PI);
    xm = xc + R * cos(PI / 2.0 - (mm + ss / 60.0) / 60.0 * 2.0 * PI);
    ym = yc + R * sin(PI / 2.0 - (mm + ss / 60.0) / 60.0 * 2.0 * PI);
    xh = xc + (R - 5) * cos(PI / 2.0 - (hh + (mm + ss / 60.0) / 60.0) / 12.0 * 2.0 * PI);
    yh = yc + (R - 5) * sin(PI / 2.0 - (hh + (mm + ss / 60.0) / 60.0) / 12.0 * 2.0 * PI);
    glColor3f(1, 0, 0);
    glBegin(GL_LINES);
    glVertex2f(xc, yc);
    glVertex2f(xs, ys);
    glEnd();

    glColor3f(1, 1, 0);
    glBegin(GL_LINES);
    glVertex2f(xc, yc);
    glVertex2f(xm, ym);
    glEnd();

    glColor3f(0, 1, 1);
        glBegin(GL_LINES);
    glVertex2f(xc, yc);
    glVertex2f(xh, yh);
    glEnd();



    glutSwapBuffers();//双缓存的刷新模式

}

void mytime(int t)

{

    theta_line += 1.0; //旋转角增量

    if (theta >= 2 * PI)

        theta -= 2 * PI;

    if (theta_line >= 2 * PI)

        theta_line -= 2 * PI;

    glutPostRedisplay(); //重画,相当于重新调用Display(),改变后的变量得以传给绘制函数

    glutTimerFunc(1000, mytime, 10);
    GetLocalTime(&timeNow); //获取系统时间 
    hh = timeNow.wHour; 		//获取小时时间 
    mm = timeNow.wMinute; 	//获取分钟时间 
    ss = timeNow.wSecond; 	//获取秒时间

}

void Reshape(GLsizei w, GLsizei h)

{

    glMatrixMode(GL_PROJECTION); //投影矩阵模式

    glLoadIdentity(); //矩阵堆栈清空

    gluOrtho2D(-1.5 * R * w / h, 1.5 * R * w / h, -1.5 * R, 1.5 * R);//设置裁剪窗口大小

    glViewport(0, 0, w, h);// 设置视区大小

    glMatrixMode(GL_MODELVIEW); //模型矩阵模式

}

void init()

{

    GetLocalTime(&timeNow);// 获取系统时间

    hh = timeNow.wHour;//获取小时时间

    mm = timeNow.wMinute;//获取分钟时间

    ss = timeNow.wSecond;//获取秒时间

}

 

void Display(void)

{
     glClear(GL_COLOR_BUFFER_BIT);
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
     //glColor3f(0,1,0); //设置黄色绘图颜色
     glBegin(GL_POLYGON); //开始绘制六边形
       for (int i=0;i<n;i++)
           glVertex2f( R*cos(theta+i*2*PI/n),R*sin(theta+i*2*PI/n));//顶点坐标
     //glColor3f(1, 0, 0); 									//设置红色绘图颜色
     glRasterPos2i(3, 2); 								//定位当前光标,起始字符位置
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'H');	//写字符"H"
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'e');	//写字符"e"
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'l');	//写字符"l"
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'l');	//写字符"l"
     glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'o');	//写字符"o"
     glEnd();

     glutSwapBuffers(); //双缓存的刷新模式

}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化范围 7 小实验5: 几何对象变形的原因 8 小实验6: 视口坐标系及视口定义 8 小实验7:动态调整长宽比例,保证几何对象不变形 9 实验 动画和交互 10 小实验1: 单缓冲动画技术 10 小实验2: 双缓冲动画技术 11 小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 17 小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单光照效果的关键步骤。 26 小实验2:光照模型2----光源位置的问题 28 小实验3:光照模型3----光源位置的问题 31 小实验4:光照模型4----光源位置的问题 33 小实验5:光照模型5----光源位置的问题 35 小实验6:光照模型6----光源位置的问题 38 小实验7:光照模型7----光源位置的动态变化 40 小实验8:光照模型8----光源位置的动态变化 43 小实验9:光照模型9---光源位置的动态变化 45 小实验10:光照模型10---聚光灯效果模拟 48 小实验11:光照模型11---多光源效果模拟 50 小实验12:光照效果和雾效果的结合 53 小实验13:纹理映射初步—掌握OpenGL纹理映射的一般步骤 56 小实验13:纹理映射—纹理坐标的自动生成(基于参数的曲面映射) 59 小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值