Python?OpenGL基本配置方式
OpenGL基本配置方式
參考:http://pyopengl.sourceforge.net
pip 安裝 PyOpenGL
pip install PyOpenGL PyOpenGL_accelerate
測(cè)試代碼
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def init():
glClearColor(1,1,1,1)
gluOrtho2D(-1,1,-1,1)
def triangle():
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1,0,0)
glBegin(GL_TRIANGLES)
glColor3f(1,0,0)
glVertex2f(-1, -1)
glColor3f(0,1,0)
glVertex2f(1, -1)
glColor3f(0,0,1)
glVertex2f(0, 1)
glEnd()
glFlush()
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(800,600)
glutInitWindowPosition(50,50)
glutCreateWindow("Triangle")
glutDisplayFunc(triangle)
init()
glutMainLoop()
if __name__ == '__main__':
main()運(yùn)行結(jié)果,繪制出一個(gè)彩色三角形:

Python+OpenGL庫(kù)理解及代碼應(yīng)用
1.讀取off文件
使用工具庫(kù)(GLUT)創(chuàng)建 OpenGL 應(yīng)用程序只需要四步:
(1)初始化glut庫(kù):glutInit()
(2)創(chuàng)建glut窗口:glutCreateWindow('Quidam Of OpenGL')
(3)注冊(cè)繪圖的回調(diào)函數(shù): glutDisplayFunc(draw)
(4)進(jìn)入glut主循環(huán): glutMainLoop()
除了基本組成以外還可以:
(5)設(shè)置窗口初始顯示模式:初始化 glut 庫(kù)的時(shí)候,一般要用 glutInitDisplayMode() 來設(shè)置初始的顯示模式。例如:
glutInitDisplayMode(?GLUT_DOUBLE?|?GLUT_ALPHA?|?GLUT_DEPTH)
(6)初始化畫布
glClearColor(0.0, 0.0, 0.0, 1.0) # 設(shè)置畫布背景色。注意:這里必須是4個(gè)參數(shù) glEnable(GL_DEPTH_TEST) # 開啟深度測(cè)試,實(shí)現(xiàn)遮擋關(guān)系 glDepthFunc(GL_LEQUAL) # 設(shè)置深度測(cè)試函數(shù)
關(guān)于draw()函數(shù)的基本組成:
(1)清除屏幕及深度緩存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
(2)設(shè)置投影
投影設(shè)置也是每次重繪都需要的步驟之一。glOrtho() 用來設(shè)置平行投影,glFrustum() 用來設(shè)置透視投影。這兩個(gè)函數(shù)的參數(shù)相同,都是視景體的 left / right / bottom / top / near / far 六個(gè)面。視景體的 left / right / bottom / top 四個(gè)面圍成的矩形,就是視口。near 就是投影面,其值是投影面距離視點(diǎn)的距離,far 是視景體的后截面,其值是后截面距離視點(diǎn)的距離。far 和 near 的差值,就是視景體的深度。視點(diǎn)和視景體的相對(duì)位置關(guān)系是固定的,視點(diǎn)移動(dòng)時(shí),視景體也隨之移動(dòng)。假設(shè) view 是視景體,width 和 height 是窗口的寬度和高度,在投影變換之前,需要先聲明是對(duì)投影矩陣的操作,并將投影矩陣單位化:
glMatrixMode(GL_PROJECTION) ,含義為選定矩陣為模型-觀察變換 矩陣
OpenGL中的變換命令都是對(duì)當(dāng)前矩陣(當(dāng)前矩陣為以后圖形變換所要使用的矩陣)進(jìn)行操作,因此在選定可修#改矩陣后,應(yīng)首先用glLoadIdentity()命令設(shè)置當(dāng)前操作矩陣為單位矩陣
glMatrixMode(GL_PROJECTION) glLoadIdentity() if width > height: k = width / height glFrustum(view [0]*k, view [1]*k, view [2], view [3], view [4], view [5]) else: k = height / width glFrustum(view [0], view [1], view [2]*k, view [3]*k, view [4], view [5])
(3)設(shè)置視點(diǎn)
視點(diǎn)是和視景體關(guān)聯(lián)的概念。設(shè)置視點(diǎn)需要考慮眼睛在哪兒、看哪兒、頭頂朝哪兒,分別對(duì)應(yīng)著eye, lookat 和 eye_up 三個(gè)向量.
gluLookAt(
#設(shè)置相機(jī)在世界坐標(biāo)系中的位置
eye[0], eye[1], eye[2],
#相機(jī)鏡頭對(duì)準(zhǔn)的物體在世界坐標(biāo)系中的位置
look_at[0], look_at[1], look_at[2],
#相機(jī)向上的方向在世界坐標(biāo)系中的方向
eye_up[0], eye_up[1], eye_up[2]
)(4)設(shè)置視口
視口的大小和尺寸是在窗口坐標(biāo)系中進(jìn)行度量的, 默認(rèn)狀 態(tài)下其坐標(biāo)原點(diǎn)位于窗口的左下角,其尺寸與窗口的大小 相同。
#glViewport(GLint x, Glint y, Glsizei width, Glsizei height) glViewport(0, 0, width, height)
(5)設(shè)置模型變換
模型平移、旋轉(zhuǎn)、縮放等幾何變換,需要切換到模型矩陣:
glMatrixMode(GL_MODELVIEW) glLoadIdentity() #平移操作函數(shù) glTanslate(x,y,z) #平移,(x,y,z,1)乘以 N(4x4矩陣)進(jìn)行矩陣變換 glMultMatrixf(N) #旋轉(zhuǎn)函數(shù),繞矢量v=(x,y,z)T逆時(shí)針方向旋轉(zhuǎn)angle指定的角度。 glRotate(angle,x,y,z) #縮放函數(shù) glScale(1.0, 1.0, 1.0)
同時(shí)使用視圖變換和模型變換,需要先調(diào)用視圖變換函數(shù),后調(diào)用模型變換函數(shù),以保證模型變換首先對(duì)物體起作用。
多種變換組合調(diào)用順序 ,寫函數(shù)的時(shí)候要注意順序,否則可能不起作用

具體代碼分析
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
def readOFF():
file_path = '../off/m1.off'
f = open(file_path, 'r', encoding='utf-8')
lines = f.readlines()
m = []
n = []
#把off文件中數(shù)據(jù)按行讀取出來,存儲(chǔ)到列表中,由于邊數(shù)事先看了為0,所以沒遍歷邊,如果邊不為0,記得遍歷,并在后文加上邊的繪制
for line in lines:
m.append(line.split())
for i in range(len(m)):
#跳過第一行的OFF
if m[i][0] == 'OFF':
continue
#記錄定點(diǎn)數(shù),面片數(shù)和邊數(shù)
elif i == 1:
v_cout = int(m[i][0])
f_count = int(m[i][1])
e_count = int(m[i][2])
continue
#把字符型數(shù)據(jù)轉(zhuǎn)化為數(shù)值型數(shù)據(jù)
else:
for j in range(len(m[i])):
m[i][j] = float(m[i][j])
n.append(m[i])
return v_cout, f_count, e_count, n
#繪畫模型
def draw():
global angle
#讀取OFF文件包含的頂點(diǎn),面片,邊和off文件存儲(chǔ)數(shù)據(jù)信息
v_cout, f_count, e_count, n = readOFF()
# 設(shè)置渲染背景
glClearColor(0.0, 0.0, 0.0, 0.0)
#清除緩存
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
# 設(shè)置投影(透視投影)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
# 投影變換
gluPerspective(100, 1, 0.5, 100)
angle += 0.05
while angle > 360:
angle -= 360
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# 視口變換
glViewport(100, 100, 500, 500)
#設(shè)置觀察變換
#設(shè)置視點(diǎn)
gluLookAt(
-5, 5, 0,
0, 0, 0,
0, 1, 0,
)
#設(shè)置模型變換
#平移
glTranslate(1, 1, 0)
#旋轉(zhuǎn)
glRotatef(angle, -5, 5, 0)
# 縮放
glScalef(5, 5, 5)
for i in range(f_count):
#獲取頂點(diǎn)個(gè)數(shù),和頂點(diǎn)信息
cout , a, b, c = n[v_cout + i]
cout, a, b, c=int(cout) ,int(a) ,int(b) ,int(c)
#得到頂點(diǎn)位置
a1, a2, a3 = n[a]
b1, b2, b3 = n[b]
c1, c2, c3 = n[c]
#繪制多面體
glBegin(GL_POLYGON)
glVertex3f(a1, a2, a3)
glVertex3f(b1, b2, b3)
glVertex3f(c1, c2, c3)
glEnd();
# 刷新緩存
glFlush()
#關(guān)閉窗口
def close(key,x,y):
if key==b'\x1b':
glutDestroyWindow(win_id)
if __name__ == "__main__":
angle = 0
# 初始化glut窗口
glutInit()
# 設(shè)置窗口顯示模式:RGBA四通道|單緩存|深度
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH)
# 初始化窗口大小
glutInitWindowSize(1000, 800)
# 創(chuàng)建窗口
win_id = glutCreateWindow("CUBE")
# 設(shè)置渲染函數(shù)
glutDisplayFunc(draw)
# 設(shè)置窗口空閑時(shí)函數(shù)
glutIdleFunc(draw)
# 開啟深度測(cè)試
glEnable(GL_DEPTH_TEST)
# 開啟窗口主循環(huán)
glutMainLoop()以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)
這篇文章主要介紹了python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
使用 Supervisor 監(jiān)控 Python3 進(jìn)程方式
今天小編就為大家分享一篇使用 Supervisor 監(jiān)控 Python3 進(jìn)程方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Django數(shù)據(jù)庫(kù)類庫(kù)MySQLdb使用詳解
Django項(xiàng)目要操作數(shù)據(jù)庫(kù),首先要和數(shù)據(jù)庫(kù)建立連接,才能讓程序中的數(shù)據(jù)和數(shù)據(jù)庫(kù)關(guān)聯(lián)起來進(jìn)行數(shù)據(jù)的增刪改查操作。這篇文章主要介紹了Django數(shù)據(jù)庫(kù)類庫(kù)MySQLdb使用詳解,感興趣的小伙伴們可以參考一下2019-04-04
Python內(nèi)置函數(shù)bin() oct()等實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換
使用Python內(nèi)置函數(shù):bin()、oct()、int()、hex()可實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換;先看Python官方文檔中對(duì)這幾個(gè)內(nèi)置函數(shù)的描述,需要了解的朋友可以參考下2012-12-12

