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;
}
}