<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
參考:http://pyopengl.sourceforge.net
pip install PyOpenGL PyOpenGL_accelerate
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()
執行結果,繪製出一個彩色三角形:
使用工具庫(GLUT)建立 OpenGL 應用程式只需要四步:
(1)初始化glut庫:glutInit()
(2)建立glut視窗:glutCreateWindow('Quidam Of OpenGL')
(3)註冊繪圖的回撥函數: glutDisplayFunc(draw)
(4)進入glut主迴圈: glutMainLoop()
除了基本組成以外還可以:
(5)設定視窗初始顯示模式:初始化 glut 庫的時候,一般要用 glutInitDisplayMode() 來設定初始的顯示模式。例如:
glutInitDisplayMode( GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
(6)初始化畫布
glClearColor(0.0, 0.0, 0.0, 1.0) # 設定畫布背景色。注意:這裡必須是4個引數 glEnable(GL_DEPTH_TEST) # 開啟深度測試,實現遮擋關係 glDepthFunc(GL_LEQUAL) # 設定深度測試函數
關於draw()函數的基本組成:
(1)清除螢幕及深度快取
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
(2)設定投影
投影設定也是每次重繪都需要的步驟之一。glOrtho() 用來設定平行投影,glFrustum() 用來設定透視投影。這兩個函數的引數相同,都是視景體的 left / right / bottom / top / near / far 六個面。視景體的 left / right / bottom / top 四個面圍成的矩形,就是視口。near 就是投影面,其值是投影面距離視點的距離,far 是視景體的後截面,其值是後截面距離視點的距離。far 和 near 的差值,就是視景體的深度。視點和視景體的相對位置關係是固定的,視點移動時,視景體也隨之移動。假設 view 是視景體,width 和 height 是視窗的寬度和高度,在投影變換之前,需要先宣告是對投影矩陣的操作,並將投影矩陣單位化:
glMatrixMode(GL_PROJECTION) ,含義為選定矩陣為模型-觀察變換 矩陣
OpenGL中的變換命令都是對當前矩陣(當前矩陣為以後圖形變換所要使用的矩陣)進行操作,因此在選定可修#改矩陣後,應首先用glLoadIdentity()命令設定當前操作矩陣為單位矩陣
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)設定視點
視點是和視景體關聯的概念。設定視點需要考慮眼睛在哪兒、看哪兒、頭頂朝哪兒,分別對應著eye, lookat 和 eye_up 三個向量.
gluLookAt( #設定相機在世界座標系中的位置 eye[0], eye[1], eye[2], #相機鏡頭對準的物體在世界座標系中的位置 look_at[0], look_at[1], look_at[2], #相機向上的方向在世界座標系中的方向 eye_up[0], eye_up[1], eye_up[2] )
(4)設定視口
視口的大小和尺寸是在視窗座標系中進行度量的, 預設狀 態下其座標原點位於視窗的左下角,其尺寸與視窗的大小 相同。
#glViewport(GLint x, Glint y, Glsizei width, Glsizei height) glViewport(0, 0, width, height)
(5)設定模型變換
模型平移、旋轉、縮放等幾何變換,需要切換到模型矩陣:
glMatrixMode(GL_MODELVIEW) glLoadIdentity() #平移操作函數 glTanslate(x,y,z) #平移,(x,y,z,1)乘以 N(4x4矩陣)進行矩陣變換 glMultMatrixf(N) #旋轉函數,繞向量v=(x,y,z)T逆時針方向旋轉angle指定的角度。 glRotate(angle,x,y,z) #縮放函數 glScale(1.0, 1.0, 1.0)
同時使用檢視變換和模型變換,需要先呼叫檢視變換函數,後呼叫模型變換函數,以保證模型變換首先對物體起作用。
多種變換組合呼叫順序 ,寫函數的時候要注意順序,否則可能不起作用
具體程式碼分析
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檔案中資料按行讀取出來,儲存到列表中,由於邊數事先看了為0,所以沒遍歷邊,如果邊不為0,記得遍歷,並在後文加上邊的繪製 for line in lines: m.append(line.split()) for i in range(len(m)): #跳過第一行的OFF if m[i][0] == 'OFF': continue #記錄定點數,面片數和邊數 elif i == 1: v_cout = int(m[i][0]) f_count = int(m[i][1]) e_count = int(m[i][2]) continue #把字元型資料轉化為數值型資料 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檔案包含的頂點,面片,邊和off檔案儲存資料資訊 v_cout, f_count, e_count, n = readOFF() # 設定渲染背景 glClearColor(0.0, 0.0, 0.0, 0.0) #清除快取 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) # 設定投影(透視投影) 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) #設定觀察變換 #設定視點 gluLookAt( -5, 5, 0, 0, 0, 0, 0, 1, 0, ) #設定模型變換 #平移 glTranslate(1, 1, 0) #旋轉 glRotatef(angle, -5, 5, 0) # 縮放 glScalef(5, 5, 5) for i in range(f_count): #獲取頂點個數,和頂點資訊 cout , a, b, c = n[v_cout + i] cout, a, b, c=int(cout) ,int(a) ,int(b) ,int(c) #得到頂點位置 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() #關閉視窗 def close(key,x,y): if key==b'x1b': glutDestroyWindow(win_id) if __name__ == "__main__": angle = 0 # 初始化glut視窗 glutInit() # 設定視窗顯示模式:RGBA四通道|單快取|深度 glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH) # 初始化視窗大小 glutInitWindowSize(1000, 800) # 建立視窗 win_id = glutCreateWindow("CUBE") # 設定渲染函數 glutDisplayFunc(draw) # 設定視窗空閒時函數 glutIdleFunc(draw) # 開啟深度測試 glEnable(GL_DEPTH_TEST) # 開啟視窗主迴圈 glutMainLoop()
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45