python+PyCharm+Opengl配置+显示三维图形实现+旋转+平移+缩放+光照
一、开发环境说明
- 操作系统:Windows
- 开发软件:PyCharm
- 编程语言:Python + Opengl
- 最终效果
二、配置操作说明
1、在终端上输入python,查询自己的python版本,如图所示
2、打开网址,找到对应自己版本的文件进行下载,如图所示
3、把下载的文件放在python安装目录下的Scirpts文件夹下面;
4、打开终端至Scirpts目录下面,输入如图所示指令进行安装;
5、打开PyCharm软件,依次点击【NewProject】–【输入项目名字】–【确定】
6、添加opengl库的引用,如图所示
7、修改添加代码如图所示
8、配置完成,点击菜单栏【run】–【Run"Main"】,运行效果如图:
三、添加平移、缩放、旋转、菜单交互操作和光照效果
1、在头部定义变量,如图所示
2、在下面主函数中添加回调事件响应函数
glutInit() # 使用glut库初始化OpenGL
# 显示模式:GLUT_SINGLE无缓冲直接显示|GLUT_RGBA采用RGB(A非alpha)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowPosition(0, 0) # 窗口位置
glutInitWindowSize(400, 400) # 窗口尺寸
glutCreateWindow(b"tutorial") # b后加窗口名字,固定格式
# -------------注册回调函数---------------------
glutDisplayFunc(display) # 调用函数绘制图像
glutKeyboardFunc(KeyboardEvent) #按键事件
glutMouseFunc(MouseEvent) # 鼠标事件
glutMotionFunc(MotionEvent)# 按下鼠标按键移动鼠标事件
glutReshapeFunc(ReshapeEvent) # 窗口大小发生变化
glutIdleFunc(IdleEvent) # 空闲时间
glutCreateMenu(MenuEvent)# 创建菜单
glutAddMenuEntry(b"Reset", 1) #菜单项1 复位
glutAddMenuEntry(b"Spare", 2) #菜单项2 待定
glutAttachMenu(GLUT_RIGHT_BUTTON) #鼠标右键按下弹出菜单
glutMainLoop() # 主循环
3、定义响应的事件处理函数,如图所示
4、在空闲事件中不断刷新绘图函数
# 空闲事件
def IdleEvent():
glutPostRedisplay()
5、在display函数添加修改如下代码
# 调用函数绘制图像事件
def display():
light() #光照函数
glClearColor(0.3, 0.3, 0.3, 1.0)# 背景颜色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 擦除背景色和深度缓存
glPushMatrix() # 压栈
glEnable(GL_COLOR_MATERIAL) # 改变物体颜色前置代码
glColor3f(0.4, 0.5, 0.5) # 设置颜色
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.5) # 绘制一个茶壶,1.5指茶壶大小
glPopMatrix() # 出栈
glutSwapBuffers() # 交换前后缓冲区
6、实现光照:在Light函数中添加如下代码
# 光源函数
def light():
ambientlight0Color = (0.0, 0.0, 0.0, 1.0)
diffuselight0Color = (1.0, 1.0, 1.0, 1.0)
specularlight0Color= (1.0, 1.0, 1.0, 1.0)
light0Position = (-2.0, 2.0, 2.0, 1.0)
ambientM = (0.11, 0.06, 0.11, 1.0)
ambientD = (0.43, 0.47, 0.54, 1.0)
ambientS = (0.33, 0.33, 0.52, 1.0)
ambientE= (0.0, 0.0, 0.0, 0.0)
ambientSE = 10;
# 设置光源
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientlight0Color)
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuselight0Color)
glLightfv(GL_LIGHT0, GL_SPECULAR, specularlight0Color)
glLightfv(GL_LIGHT0, GL_POSITION, light0Position)
# 设置材质
glMaterialfv(GL_FRONT, GL_AMBIENT, ambientM)
glMaterialfv(GL_FRONT, GL_DIFFUSE, ambientD)
glMaterialfv(GL_FRONT, GL_SPECULAR, ambientS)
glMaterialfv(GL_FRONT, GL_EMISSION, ambientE)
glMaterialf(GL_FRONT, GL_SHININESS, 10.0)
# 启动光照
glEnable(GL_LIGHT0)
glEnable(GL_LIGHTING)
7、实现平移:通过监控键盘按键,改变平移变量的值,从而平移物体
# 键盘事件 上下左右键
def KeyboardEvent(key, x, y):
global m_tranlate
if (key == b'W'):
m_tranlate[1] += 0.1 # 上移动
elif (key == b'S'):
m_tranlate[1] -= 0.1 # 下移动
elif (key == b'A'):
m_tranlate[0] -= 0.1 # 左移动
elif (key == b'D'):
m_tranlate[0] += 0.1 # 右移动
8、菜单事件:响应菜单命令
def MenuEvent(choose):
if (choose == 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
9、实现旋转:通过鼠标左键按下后移动鼠标来实现旋转角度的变化
10、实现缩放:通过鼠标滚轮滚动,如果向上滚动则放大,向下滚动则缩小
11、大功告成,旋转+平移+缩放+菜单+光照 效果图如图所示
四、工程代码下载
整个工程代码都可以下载,如果有疑惑可以留言,谢谢。