python+PyCharm+Opengl配置+显示三维图形实现+旋转+平移+缩放+光照

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

四、工程代码下载

整个工程代码都可以下载,如果有疑惑可以留言,谢谢。

社交账号快速登录