OpenGL学习笔记——点、线、面的绘制

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 ?
参考:目光博客

猜你喜欢

转载自blog.csdn.net/qq_41140138/article/details/100597540
今日推荐