OpenGL -- 多颜色的立方体旋转

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26437925/article/details/53055535

 截图

这里写图片描述

  • 通过上下左右键可以控制立方体的旋转

  • 当窗口大小变化时,显示会出现变化,可以修改本程序,再设计

完整代码

#include <gl\glut.h>    
#include <gl\GLU.h>
#include <gl\GL.h>
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define PI 3.1415926     
int WinWidth, WinHeight;

// 旋转角度,初始可以随便设置
float rotateX = 20.0f;
float rotateY = 30.0f;

void Draw()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    // 立方体的8个顶点坐标
    GLfloat vertex_list[][3] = { 
        -0.5f, -0.5f, -0.5f,
        0.5f, -0.5f, -0.5f,
        -0.5f, 0.5f, -0.5f,
        0.5f, 0.5f, -0.5f,
        -0.5f, -0.5f, 0.5f,
        0.5f, -0.5f, 0.5f,
        -0.5f, 0.5f, 0.5f,
        0.5f, 0.5f, 0.5f,
    };

    GLint index_list[][4] = {
        0, 2, 3, 1,
        0, 4, 6, 2,
        0, 1, 5, 4,
        4, 5, 7, 6,
        1, 3, 7, 5,
        2, 6, 7, 3,
    };

#if 0
    // 只有正面,并且只显示边线,不进行填充
    glFrontFace(GL_CCW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif

    // 设置旋转
    glRotatef(rotateX, 1.0f, 0.0f, 0.0f);
    glRotatef(rotateY, 0.0f, 1.0f, 0.0f);

    // 定义不同的颜色
    GLfloat colors[][3] = { { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0 },
        { 1.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0 }, { 0.0, 1.0, 1.0 },
        { 1.0, 0.5, 0.5 }, { 0.0, 0.5, 0.5 } };

    int i, j;

    glBegin(GL_QUADS); // 绘制四边形
    for (i = 0; i < 6; ++i)         // 有六个面,循环六次
    {
        glColor3f(colors[i][0], colors[i][1], colors[i][2]);
        for (j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次
        {
            glVertex3fv(vertex_list[index_list[i][j]]);
        }
    }
    glEnd();

    glutSwapBuffers();
}

void Reshape(int w, int h)
{
    WinWidth = w;
    WinHeight = h;
    // //改变显示区域,起始位置为客户端窗口左下角(非坐标原点)
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //宽高比改为当前值,视线区域与屏幕大小一致;
    gluPerspective(45, 1.0*WinWidth / WinHeight, 1, 1000);
    // 开启更新深度缓冲区的功能
    glEnable(GL_DEPTH_TEST);
    // 摄像机视图观看,从 (0,5,20) 往(0,0,0)处看,(0,1,0)为正方向
    gluLookAt(0, 5, 20, 0, 0, 0, 0, 1, 0);
}

void SpecialKeys(int key, int x, int y)
{
    if (key == GLUT_KEY_UP)   rotateX -= 5.0f;
    if (key == GLUT_KEY_DOWN)  rotateX += 5.0f;
    if (key == GLUT_KEY_LEFT)  rotateY -= 5.0f;
    if (key == GLUT_KEY_RIGHT)  rotateY += 5.0f;

    if (rotateX > 356.0f)  rotateX = 0.0f;
    if (rotateX < -1.0f)  rotateX = 355.0f;
    if (rotateY > 356.0f)  rotateY = 0.0f;
    if (rotateY < -1.0f)  rotateY = 355.0f;

    //刷新窗口
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
    WinWidth = 800;
    WinHeight = 800;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE);
    //glutInitWindowPosition(100, 100);
    glutInitWindowSize(WinWidth, WinHeight);
    glutCreateWindow("HelloOpenGL");

    /*
    目的:当窗口尺寸改变时,图形比例不发生变化
    思路:窗口宽高比改变时,通过改变窗口显示区域大小,并利用投影矩阵改变观测物体大小使之适应变化。
    */
    glutReshapeFunc(&Reshape);
    glutDisplayFunc(&Draw);

    //glutKeyboardFunc(processNormalKeys);
    glutSpecialFunc(SpecialKeys);

    glutMainLoop();
    return 0;
}

参考

阅读更多
换一批

没有更多推荐了,返回首页