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) # 设置当前颜色为蓝色
其中:
- *3f() 为一般不透明颜色;
- *4f() 为透明色;
-
**ub() 为十六进制颜色 (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
- step_ms:计时器停止时间,即 int(1/FPS*1000) (注意!单位:ms!)
- func:计时器函数,函数最后需再次调用glutTimerFunc(),以达到循环。接收一个 state 参数
- state:用于区分计时器,也是 func 唯一的参数
def timerun(state):
#
#
#
glutTimerFunc(STEP_MS, timerun, state)
def main():
#
#
#
glutTimerFunc(SETP_MS, timerun, 0)