控制台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、大功告成,旋转+平移+缩放+菜单+光照 效果图如图所示

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

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 14
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热带宇林V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值