OpenGL——旋转的六边形(动画)

本文介绍了一个使用OpenGL实现的六边形旋转动画程序。通过C++编程语言和GLUT库来绘制并动态展示一个彩色六边形,该六边形会响应用户的鼠标点击进行旋转。代码中详细展示了如何初始化OpenGL环境、创建显示列表、处理旋转动画及用户输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

#include<iostream>
#include <math.h>
#include<Windows.h>
#include <GL/glut.h>

using namespace std;

const double TWO_PI = 6.2831853;

GLsizei winWidth = 500, winHeight = 500;
GLuint regHex;
static GLfloat rotTheta;

class scrPt {
public:
    GLint x, y;
};


void init()
{
    scrPt hexVertex;
    GLdouble hexTheta;

    glClearColor(1.0, 1.0, 1.0, 0.0);
    //创建1个显示列表
    regHex = glGenLists(1);
    //编译显示列表
    glNewList(regHex, GL_COMPILE);
        glColor3f(209.0 / 255.0, 73.0 / 255.0, 78.0 / 255.0);
        glBegin(GL_POLYGON);
            for (GLint k = 0; k < 6; k++) {
                hexTheta = TWO_PI * k / 6;
                hexVertex.x = 150 + 100 * cos(hexTheta);
                hexVertex.y = 150 + 100 * sin(hexTheta);
                glVertex2i(hexVertex.x, hexVertex.y);
            }
        glEnd();
    glEndList();
}

void displayHex()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    //旋转操作
    glRotatef(rotTheta, 0.0, 0.0, 1.0);
    //执行显示列表
    glCallList(regHex);    
    glPopMatrix();
    //互换缓存
    glutSwapBuffers();                
    glFlush();
}

//计算增加的旋转角度
void rotateHex()
{
    rotTheta += 3.0;
    if (rotTheta > 360.0) {
        rotTheta -= 360.0;
    }
    //标记当前窗口需要重新绘制
    //通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板
    glutPostRedisplay();
}


void winReshapeFcn(GLint newWidth, GLint newHeight)
{
    glViewport(0, 0, (GLsizei)newWidth, (GLsizei)newHeight);

    glMatrixMode(GL_PROJECTION);
    //重置当前指定的矩阵为单位矩阵,相当于复位操作
    glLoadIdentity();
    gluOrtho2D(-320.0, 320.0, -320.0, 320.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
}

void mouseFcn(GLint button, GLint action, GLint x, GLint y)
{
    switch (button) {
    case GLUT_LEFT_BUTTON:                //鼠标左键,开始旋转
        if (action == GLUT_DOWN) {
            //全局的回调函数,如果启用则rotateHex会被不断调用,直到有窗口事件发生
            glutIdleFunc(rotateHex);
        }
        break;
    case GLUT_RIGHT_BUTTON:                    //鼠标右键,停止旋转
        if (action == GLUT_DOWN) {
            //参数为NULL说明不改变
            glutIdleFunc(NULL);
        }
        break;
    defalut:
        break;
    }
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowPosition(100, 100);

    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("第一个动画程序");
    init();
    glutDisplayFunc(displayHex);
    glutReshapeFunc(winReshapeFcn);
    glutMouseFunc(mouseFcn);
    glutMainLoop();

    system("pause");
    return 0;
}

运行结果:

 

 

//样本程序: 旋转六边形 #include "stdafx.h" #include #include #define PI 3.14159 //设置圆周率 int n=6, R=10; //多边形变数,外接圆半径 float theta=0.0; //旋转初始角度值 void Keyboard(unsigned char key, int x, int y); void Display(void); void Reshape(int w, int h); void myidle(); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); char *argv[] = {"hello ", " "}; int argc = 2; // must/should match the number of strings in argv glutInit(&argc;, argv); //初始化GLUT库; glutInitWindowSize(700,700); //设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲) glutCreateWindow("A Rotating Square"); // 创建显示窗口 glutDisplayFunc(Display); //注册显示回调函数 glutReshapeFunc(Reshape); //注册窗口改变回调函数 glutIdleFunc(myidle); //注册闲置回调函数 glutMainLoop(); //进入事件处理循环 return 0; } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0,0); //设置红色绘图颜色 glBegin(GL_POLYGON); //开始绘制六边形 for (int i=0;i=2*PI) theta-=2*PI; glutPostRedisplay(); //重画,相当于重新调用Display(),改编后的变量得以传给绘制函数 } 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); //模型矩阵模式 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值