PyOpenGL学习笔记

Positron 于 2022-07-25 发布

OpenGL-Python 学习笔记

安装

Python Extension Packages for Windows - Christoph Gohlke (uci.edu) 下载pyopengl的相关.whl文件,文件格式为 PyOpenGL-...-cp...-win_amd64.whl,之后用 pip install ***.whl 安装即可。

程序

导入包

from OpenGL.GL import *		# GL 本体
from OpenGL.GLUT import *	# GLUT 工具库

主程序

颜色与基本图形

颜色设置
glColor3f(1.0,0.0,0.0)			 # 设置当前颜色为红色
glColor4f(0.0,1.0,1.0,1.0)		# 设置当前颜色为青色,不透明度
glColor3ub(0, 0, 255)			  # 设置当前颜色为蓝色

其中:

顶点&坐标系
glVertex2f(1.0, 0.5)			# 平面上的点
glVertex3f(0.5, 1.0, 0.0)		# 空间中的点
glVertex4f(0.5, 1.0, 0.0, 1)	# 空间(齐次坐标)
基本图形

OpenGL通过 glBegin()glEnd() 来绘制图形,参数列表如下:

参数 说明
GL_POINTS 绘制一个或多个顶点
GL_LINES 绘制线段
GL_LINE_STRIP 绘制连续线段
GL_LINE_LOOP 绘制闭合的线段
GL_POLYGON 绘制多边形
GL_TRIANGLES 绘制一个或多个三角形
GL_TRIANGLE_STRIP 绘制连续三角形
GL_TRIANGLE_FAN 绘制多个三角形组成的扇形
GL_QUADS 绘制一个或多个四边形
GL_QUAD_STRIP 绘制连续四边形

程序见 1-颜色与基本图形.py

设置初始显示模式

初始化glut时用 glutInitDisplayMode() 来设置,参数如下:

参数 说明
GLUT_RGB 指定RGB颜色模式的窗口
GLUT_RGBA 指定RGBA 颜色模式的窗口
GLUT_INDEX 指定颜色索引模式的窗口
GLUT_SINGLE 指定单缓存窗口
GLUT_DOUBLE 指定双缓存窗口
GLUT_ACCUM 窗口使用累加缓存
GLUT_ALPHA 窗口的颜色分量包含 alpha 值
GLUT_DEPTH 窗口使用深度缓存
GLUT_STENCIL 窗口使用模板缓存
GLUT_MULTISAMPLE 指定支持多样本功能的窗口
GLUT_STEREO 指定立体窗口
GLUT_LUMINANCE 窗口使用亮度颜色模型
建议使用双缓存窗口,一般选择 GLUT_DOUBLE GLUT_ALPHA GLUT_DEPTH 作为参数来设置初始的显示模式。

初始化画布

glClearColor(0.0, 0.0, 0.0, 1.0) # 设置画布背景色。注意:这里必须是4个参数
glEnable(GL_DEPTH_TEST)          # 开启深度测试,实现遮挡关系
glDepthFunc(GL_LEQUAL)           # 设置深度测试函数(GL_LEQUAL只是选项之一)

清除屏幕&深度缓存

用在重绘之前。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

主程序:main()

def main():
    # 1-初始化
    glutInit()
    displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH
    glutInitDisplayMode(displayMode)

    # 2-窗口设置
    glutInitWindowSize(WIN_W, WIN_H)
    glutInitWindowPosition(300, 200)
    glutCreateWindow("Test")
    init()                          # 初始化画布
    
    # 3-注册事件函数
    glutDisplayFunc(draw)               # 注册回调函数draw()
    glutReshapeFunc(reshape)            # 注册响应窗口改变的函数reshape()
    glutMouseFunc(mouseclick)           # 注册响应鼠标点击的函数mouseclick()
    glutMotionFunc(mousemotion)         # 注册响应鼠标拖拽的函数mousemotion()
    glutKeyboardFunc(keydown)           # 注册键盘输入的函数keydown()
    glutTimerFunc(STEP_MS, timerun, 0)		# 注册计时器函数timerun()
    
    # 4-循环
    glutMainLoop()

计时器函数:glutTimerFunc(int step_ms, func*, int state)

该函数接收三个参数:step_ms, func, state

def timerun(state):
    #
    #
    #
    
    glutTimerFunc(STEP_MS, timerun, state)
    
def main():
    #
    #
    #
    
    glutTimerFunc(SETP_MS, timerun, 0)