控制台GLUT+OPENGL配置+显示三维图形实现 旋转 平移 滚轮缩放+光照效果

A 控制台GLUT+OPENGL配置+显示三维图形实现 旋转 平移 滚轮缩放+光照效果

一、开发环境说明

  • 操作系统:windows
  • 开发软件:Visual Studio 2017
  • 编程语言:基于控制台下的opengl

二、配置操作说明

配置opengl,并搭建opnegl框架并显示出绘制的图形

1、打开vs2017软件,依次点击【文件】–【新建】–【项目】,选择【Visual C++】下面的 【Widows控制台程序】,如下图所示


2、点击【确定】。等待自动生成如图所示

3、下载glut.h,glut32.lib放在当前工程所在的文件夹下面,如图所示

4、添加头文件,如图所示。这样添加的好处:在没有配置opengl环境的电脑上,程序依旧能运行。

5、修改添加代码如图所示

6、配置完成,点击菜单栏【调试】–【开始调试(s)】,运行效果如图:

三、添加平移、缩放、旋转、菜单交互操作和光照效果

1、在头部定义变量,如图所示

2、在【main】函数中添加回调事件响应函数
int main(int argc, char** argv)
{
    glutInit(&argc, (char**)argv); //对GLUT进行初始化 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //设置模式为:双缓冲,深度缓存区
    glutInitWindowPosition(110, 120);//窗口位置
    glutInitWindowSize(440, 400);//窗口大小
    glutCreateWindow("project");  //创建窗口
    glutDisplayFunc(display);    // 重新绘制事件 
    //-------------注册回调函数---------------------//
    glutKeyboardFunc(KeyboardEvent); // 键盘事件
    glutMouseFunc(MouseEvent);       //鼠标事件
    glutReshapeFunc(ReshapeEvent);   //窗口大小发生变化事件
    glutMotionFunc(MotionEvent);     //按下鼠标按钮移动鼠标事件
    glutIdleFunc(IdleEvent);         //空闲处理事件
    glutEntryFunc(MouseEntry);       //检测鼠标进入或离开窗口
    {
    glutCreateMenu(MenuEvent);       //创建菜单
    glutAddMenuEntry("复位", 1);     //菜单项1
    glutAddMenuEntry("待定", 2);     //菜单项2
    glutAttachMenu(GLUT_RIGHT_BUTTON);//鼠标右键按下弹出菜单
    }
    glutMainLoop();                  //调用已注册的回调函数 
    return 0;
}
3、定义响应的事件处理函数,如图所示

4、在【display】和【IdleEvent】函数中添加修改如下代码
//重新绘制
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 擦除背景色和深度缓存
    glPushMatrix();//压栈
    glColor3f(1.0, 0, 0);//设置颜色为红色
    glTranslatef(m_tranlate[0], m_tranlate[1], m_tranlate[2]);//平移(X,Y,Z)
    glRotatef(m_rorate[0], 1, 0, 0);//旋转 绕X轴
    glRotatef(m_rorate[1], 0, 1, 0);//旋转 绕Y轴
    glScalef(m_scale, m_scale, m_scale);//缩放(X,Y,Z)
    glutSolidTeapot(1.0);//绘制一个茶壶,1.0:指的是茶壶大小
    glPopMatrix();//出栈
    glutSwapBuffers();//交互前后缓冲区
}
//空闲事件处理事件
void IdleEvent()
{
    glutPostRedisplay(); //刷新函数
}
5、实现缩放:通过鼠标滚轮滚动,如果向上滚动则放大,向下滚动则缩小
//鼠标事件
void MouseEvent(int button, int state, int x, int y)
{
    //1、鼠标缩放:往上滚动放大;往下滚动缩小
    if (state == GLUT_UP && button == GLUT_WHEEL_UP)//滚轮往上滚动
    {
        m_scale += 0.1;
    }
    else if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)//滚轮往下滚动
    {
        m_scale -= 0.1;
        if (m_scale < 0.1) m_scale = 0.1;
    }
}   
6、实现平移:通过监控键盘按键,改变平移变量的值,从而平移物体
//键盘事件 默认是英文输入法下的大写字母
void KeyboardEvent(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'W'://上移动
        m_tranlate[1] += 0.1;
        break;
    case 'S'://下移动
        m_tranlate[1] -= 0.1;
        break;
    case 'A'://左移动
        m_tranlate[0] -= 0.1;
        break;
    case 'D'://右移动
        m_tranlate[0] += 0.1;
        break;
    }
}
7、实现旋转:通过鼠标左键按下后移动鼠标来实现旋转角度的变化
8、实现光照:启动光照
glEnable(GL_LIGHT0);//启动一号灯
glEnable(GL_LIGHTING);//开启光照
9、菜单事件:响应菜单命令
//点击菜单响应事件
void MenuEvent(int choose)
{
    switch (choose)
    {
    case 1://复位:把旋转平移缩放的值复位
        //用于平移,对应X Y Z 平移量。按键W:上  S:下   A:左  D:右
        m_tranlate[0] = 0;
        m_tranlate[1] = 0;
        m_tranlate[2] = -10;

        //用于旋转,分别是绕X轴 和Y轴旋转的角度,用鼠标左键控制
        m_rorate[0] = 0;
        m_rorate[1] = 0;

        //用于缩放,用鼠标中间滚轮控制
        m_scale = 1.0;

        //记录鼠标坐标点,用于控制旋转角度;
        m_MouseDownPT[0] = 0;
        m_MouseDownPT[1] = 0;

        //记录鼠标左键是否按下,按下为true,初始值为false
        m_bMouseDown = false;
        break;
    case 2://功能待定:暂时不做处理
        break;

    }
}
10、大功告成,旋转+平移+缩放+菜单+光照 效果图如图所示

四、 整个工程代码进行下载

社交账号快速登录