glut小文章

该博客展示了如何使用OpenGL进行3D图形编程,通过GLUT库创建一个3D场景,包含旋转的物体和颜色变化。程序定义了不同形状和颜色的图形,并使用计时器实现周期性的旋转效果,为初学者提供了理解OpenGL图形渲染和动画制作的基础。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
#include <ctime>
#include <cmath>

#define GRAVITY -9.8f

const int Interval = 16;

GLfloat AngleX;
GLfloat AngleY;

float animateTime;
float animateTimeX;
float animateRotation;      // variable to track the current amount of rotation steps
float animateTranslation;

GLfloat COLORS[6][3] = {
    { 1.0f, 0.0f, 0.0f },
    { 1.0f, 1.0f, 0.0f },
    { 0.0f, 1.0f, 0.0f },
    { 0.0f, 1.0f, 1.0f },
    { 0.0f, 0.0f, 1.0f },
    { 1.0f, 0.0f, 1.0f },
};

void cylinder(float radius, float height)
{
    GLUquadricObj *state = gluNewQuadric();

    glPushMatrix();
    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);//这里和下面哪个,旋转-90度,是因为模型是z轴为主轴的,旋转到y轴。
    gluCylinder(state, radius, radius, height, 32, 32);
    glPopMatrix();

    gluDeleteQuadric(state);
}

void pipe(float radius, float a1, float a2)
{
    GLUquadricObj *state = gluNewQuadric();

    glPushMatrix();
    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
    gluPartialDisk(state, 0.0f, radius, 32, 32, a1, a2);
    glPopMatrix();

    gluDeleteQuadric(state);
}

void drawobj(float size)
{
    glPushMatrix();

    //左右两个杆
    glPushMatrix();
    glTranslatef(size * 0.75f, 0.0f, size * 0.125f);
    cylinder(size * 0.025f, size * 0.65f);

    //加个转接口圆,看着圆润
    glTranslatef(0.0f, size * 0.65f, 0.0f);
    glutSolidSphere(size * 0.025f, 16, 16);

    glPopMatrix();

    glPushMatrix();
    glTranslatef(size * 0.75f, 0.0f, size * -0.125f);
    cylinder(size * 0.025f, size * 0.65f);

    //加个转接口圆,看着圆润
    glTranslatef(0.0f, size * 0.65f, 0.0f);
    glutSolidSphere(size * 0.025f, 16, 16);

    glPopMatrix();

    //横杠
    glPushMatrix();
    glTranslatef(size * 0.75f, size * 0.65f, 0.0f);
    glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
    glTranslatef(0.0f, -size * 0.125f, 0.0f);
    cylinder(size * 0.025f, size * 0.25f);
    glPopMatrix();

    //和顶端链接
    glPushMatrix();
    glTranslatef(0.0f, size * 1.0f, 0.0f);
    glRotatef(-115.0f, 0.0f, 0.0f, 1.0f);
    cylinder(size * 0.0125f, size * 0.85f);
    glPopMatrix();

    //画个圈
    /*glPushMatrix();
    glTranslatef(size * 0.75f, 0.75f, 0.0f);
    glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
    glutSolidTorus(0.05f, 0.25f, 32, 32);
    glPopMatrix();*/

    glPopMatrix();
}

void init()
{
    AngleX =25.0f;
    AngleY = 0.0f;

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    //glEnable(GL_DITHER);
    glShadeModel(GL_SMOOTH);
}

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

    //返回模型矩阵
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    const float size = 1.0f;

    // 全局摄像机视觉
    glTranslatef(0.0f, -size / 2.0f, 0.0f);
    glRotatef(AngleX, 1.0f, 0.0f, 0.0f);
    glRotatef(AngleY, 0.0f, 1.0f, 0.0f);

    //底盘
    glColor3f(1.0f, 1.0f, 1.0f);
    cylinder(size, 0.1f);

    //中间的杆
    glColor3f(0.5f, 0.5f, 1.0f);
    cylinder(0.05f, size);

    //顶端球
    glColor3f(1.0f, 1.0f, 1.0f);
    glPushMatrix();
    glTranslatef(0.0f, size, 0.0f);
    glutSolidSphere(size * 0.08, 16, 16);
    glPopMatrix();

    //色盘
    glPushMatrix();
    glTranslatef(0.0f, 0.1f, 0.0f);
    for (int i = 0; i < 6; ++i) {
        glColor3fv(COLORS[i]);
        pipe(size, i * 60, 60);
    }
    glPopMatrix();

    //物品
    for (int i = 0; i < 6; ++i) {
        glColor3fv(COLORS[(i + 4) % 6]);
        //每60度画一个
        glPushMatrix();
        glRotatef(60.0f * i, 0.0f, 1.0f, 0.0f);
        drawobj(size);
        glPopMatrix();
    }

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    GLfloat aspect = (GLfloat) w / (GLfloat) h;
    GLfloat nRange = 2.0f;
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    if (w <= h) {
        glOrtho(-nRange, nRange, -nRange * aspect, nRange * aspect, -nRange, nRange);
    }
    else {
        glOrtho(-nRange, nRange, -nRange / aspect, nRange / aspect, -nRange, nRange);
    }
}

//计时器事件
void timer(int n)
{
    //计时器设置的是 Interval 毫秒一次,7秒一圈的算法:
    float t = Interval / 1000.0f;//每次执行多少秒
    t *= 360.0f;//一圈多少秒
    t /= 7.0f;
    AngleY += t;

    //刷新界面
    glutPostRedisplay();

    glutTimerFunc(Interval, timer, 0);
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("OpenGL Cube");

    init();

    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutTimerFunc(Interval, timer, 0);

    glutMainLoop();

    return 0;
}

程序运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值