欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从零开始PyopenGL(1): 简单图形绘制

程序员文章站 2022-06-15 12:37:21
...
不多废话上代码,注释应该很清楚了
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/3/23 16:25
# @Author  : Barry
# @Site    : 
# @File    : learn.py
# @Software: PyCharm

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import numpy as np

# 画圆
def circle(x, y, r, n):
    theta = np.linspace(0, 2*np.pi, n)
    x = x + r * np.cos(theta)
    y = y + r * np.sin(theta)
    return x, y
def plotfunc():
    glClear(GL_COLOR_BUFFER_BIT)        # 清除之前缓存

    glPointSize(3.0)                    # 设置点大小
    glColor3f(1.0, 0.0, 0.0)            # 设置点颜色
    glBegin(GL_POINTS)                  # 此次开始,设置此次画的几何图形
    x, y = circle(0, 0, 1, 100)
    for x_, y_ in zip(x, y):
        glVertex2f(x_, y_)
    glEnd()                             # 此次结束

    glFlush()                           # 刷新屏幕

if __name__ == '__main__':
    glutInit(sys.argv)  #初始化
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) #设置显示模式
    glutInitWindowPosition(100, 100)    #窗口打开的位置,左上角坐标在屏幕坐标
    glutInitWindowSize(900, 600)        #窗口大小
    glutCreateWindow(b"Function Plotter")   #窗口名字,二进制
    glutDisplayFunc(plotfunc)           #设置当前窗口的显示回调
    glClearColor(1.0, 1.0, 1.0, 1.0)    # 设置背景颜色
    gluOrtho2D(-5.0, 5.0, -5.0, 5.0)    # 设置显示范围
    glutMainLoop()                      # 启动循环


主函数基本不需要变,其中glutInitDisplayMode的可选参数有

GLUT_RGB
0x0000
指定 RGB 颜色模式的窗口
GLUT_RGBA
0x0000
指定 RGBA 颜色模式的窗口
GLUT_INDEX
0x0001
指定颜色索引模式的窗口
GLUT_SINGLE
0x0000
指定单缓存窗口
GLUT_DOUBLE
0x0002
指定双缓存窗口
GLUT_ACCUM
0x0004
窗口使用累加缓存
GLUT_ALPHA
0x0008
窗口的颜色分量包含 alpha 值
GLUT_DEPTH
0x0010
窗口使用深度缓存
GLUT_STENCIL
0x0020
窗口使用模板缓存
GLUT_MULTISAMPLE
0x0080
指定支持多样本功能的窗口
GLUT_STEREO
0x0100
指定立体窗口
GLUT_LUMINANCE
0x0200
窗口使用亮度颜色模型

不是特别清各个参数的意义,先用着吧,等以后学的更深入再说打

glBegin设置了即将绘制的几何图形,选项有....不多废话,上个图

从零开始PyopenGL(1): 简单图形绘制

代码的结果可以看到是一堆点组成了圆

把26行的参数改成折线

    glBegin(GL_LINE_STRIP)                  # 此次开始,设置此次画的几何图形

这里之所以用GL_LINE_STRIP就能产生封闭的圆,是因为生成数据时候用的就是0-2π

所以换成用GL_LINE_LOOP效果是一样的