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

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值