点
3D图象中最小单位被称为图元,包括点、线和面。
点:点是最基本的图元,在PyOpenGL中表示方法:
glVertex(x, y, [z], [w])
最多可以使用4个参数,其中2D就是 glVertex2f(x, y)
, 3D就是 glVertex3f(x, y, z)
绘制图元
OpenGL的所有指令都必须包含在glBegin()、glEnd()函数之间!比如:
glBegin(MODE)
glVertex2f(x1, y1)
glVertex2f(x2, y2)
...
glEnd()
参数MODE为绘制对象的类型,包含以下情况
MODE | 描述 |
---|---|
GL_POINTS | 单个顶点集 |
GL_lines | 线段集合 |
GL_LINE_STRIP | 不闭合连续线段 |
GL_LINE_LOOP | 闭合的线段 |
GL_POLYGON | 多边形 |
GL_TRIANGLES | 独立三角形集合 |
GL_TRANGLE_STRIP | 三角形串,线性连续 |
GL_TRIANGLE_FAN | 三角形串,扇形连续 |
GL_QUADS | 独立四边形集合 |
GL_QUAD_STRIP | 四边形串 |
可以参考下面这张图,注意,glBegin和glEnd之间点的顺序为逆时针排列
绘制实例
实例1:绘制点、线、四边形和多边形
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
def circle(x, y, r, n):
"""返回一个圆上点的集合"""
theta = np.linspace(0, 2*np.pi, n) # 返回一个列表
x += r*np.cos(theta) # x, y也为列表
y += r*np.sin(theta)
return x, y
def init():
glClearColor(0.0, 0.0, 0.0, 1.0) # 设置背景色
gluOrtho2D(-1.0, 1.0, -1.0, 1.0) # 设置坐标
def drawFunc():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_LINES)
glVertex2f(-1.0, 0.0) # 绘制横线
glVertex2f(1.0, 0.0)
glVertex2f(0.0, -1.0) # 绘制竖线
glVertex2f(0.0, 1.0)
glEnd()
glPointSize(8.0) # 绘制点
glBegin(GL_POINTS)
glColor3f(1.0, 0.0, 0.0)
glVertex2f(-0.5, 0.7)
glColor3f(0.0, 1.0, 0.0)
glVertex2f(-0.7, 0.4)
glColor3f(0.5, 0.5, 1.0)
glVertex2f(-0.3, 0.4)
glEnd()
glPointSize(3.0) # 绘制圆
glColor3f(1.0, 0.5, 0.5)
glBegin(GL_POINTS)
#glBegin(GL_LINE_LOOP)
x, y = circle(0.5, 0.5, 0.4, 100)
for a, b in zip(x, y):
glVertex2f(a, b)
glEnd()
glColor3f(1.0, 0.8, 0.5) # 绘制独立四边形
glBegin(GL_QUADS)
glVertex2f(-0.7, -0.3)
glVertex2f(-0.3, -0.3)
glVertex2f(-0.3, -0.7)
glVertex2f(-0.7, -0.7)
glEnd()
glColor3f(0.6, 1.0, 1.0) # 绘制多边形
glPolygonMode(GL_FRONT, GL_FILL)
glPolygonMode(GL_BACK, GL_LINE)
glBegin(GL_POLYGON)
glVertex2f(0.5, -0.1)
glVertex2f(0.2, -0.3)
glVertex2f(0.2, -0.6)
glVertex2f(0.5, -0.8)
glVertex2f(0.8, -0.6)
glVertex2f(0.8, -0.3)
glEnd()
glFlush()
glutInit()
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE)
glutInitWindowSize(600, 600)
glutInitWindowPosition(400, 100)
glutCreateWindow("Draw")
init()
glutDisplayFunc(drawFunc)
glutMainLoop()
绘制结果:(用的都是我喜欢的颜色?)
代码说明
初始化
gluOrtho2D(left, right, bottom, top):参数分别代表了窗口的边界坐标,坐标范围越大,我们看到的东西越多,但看到的也就越小
分割线
这里没有指定颜色,默认背景色为黑,前景色为白色
glBegin(GL_LINES)
glVertex2f(-1.0, 0.0) # 绘制横线
glVertex2f(1.0, 0.0)
glVertex2f(0.0, -1.0) # 绘制竖线
glVertex2f(0.0, 1.0)
glEnd()
左上区域
这里绘制了3个点,每个点大小为8个像素8px
右上区域
circle()函数:6-11行中circle函数用于采集以(x, y)为圆心,以r为半径的圆上的点,采集n个点,采样以theta角度为间隔,返回值x, y为列表;使用GL_LINE_LOOP模式绘制闭合曲线圆
def circle(x, y, r, n):
"""返回一个圆上点的集合"""
theta = np.linspace(0, 2*np.pi, n) # 返回一个列表
x += r*np.cos(theta) # x, y也为列表
y += r*np.sin(theta)
return x, y
x, y = circle(0.5, 0.5, 0.4, 100)
for a, b in zip(x, y):
glVertex2f(a, b)
右下区域
55-56行这里使用了两行语句说明是否填充,glPolygonMode()指定了如何绘制面的方式:
GL_LINE为只画线
GL_FILL则是默认的填充
glPolygonMode(GL_FRONT, GL_FILL)
glPolygonMode(GL_BACK, GL_LINE)
实例2:绘制二次曲线,修改init()和drawFuc()函数
def init():
glClearColor(1.0, 1.0, 1.0, 1.0)
gluOrtho2D(-5.0, 5.0, -5.0, 5.0)
def drawFuc():
glClear(GL_COLOR_BUFFER_BIT)
glPointSize(3.0)
glColor3f(0.5, 0.5, 0.5)
glBegin(GL_LINES)
glVertex2f(-5.0, 0.0)
glVertex2f(5.0, 0.0)
glVertex2f(0.0, -5.0)
glVertex2f(0.0, 5.0)
glEnd()
glColor3f(0.0, 0.0, 0.0)
glBegin(GL_POINTS)
for x in (i*0.1 for i in range(-50, 50)):
y = x**2
glVertex2f(x, y)
glEnd()
glFlush()
绘制结果:
对图元的绘制学习到这里就结束了,可以自行尝试绘制其他类型的图元~
完结 cheers ?
参考:目光博客