點
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 🍻
參考:目光博客